Drupal Core uses that itself for test entity types:

So yes, this works. However, it only works as far as it is covered by PHP. You can inherit base field definitions for example if you call the parent method and use the return value, see those classes.
Annotations for example are however not inherited, each subclass needs to re-define everything.
There is the plan to provide a default content entity that will a default set of base field definitions and other things that you probably want to have on custom entity types, likely that will live in the 8.x version of the entity.module.
On what you want to use, that depends on your use case. The common use case for bundles is so that users/site builders can create them and add configurable fields. If you need that, use them.
Keep in mind that not everything is generic, various things are still node specific, like the whole revision handling (the storage is generic, but all the user interfaces require a ton of custom code at the moment), the node preview functionality is also custom and other things. We plan to improve that situation in the mentioned entity.module until we can improve it in core.
foo
the entity controller class, Drupal's never even going to know it exists. Of course you need to manage things smartly inside that base class - if there's entity type-specific logic, make sure it lives in the subclass, not infoo
– Clive♦ Oct 1 '15 at 14:23