There probably isn't a single best strategy (the silver bullet), if it was, Hibernate wouldn't have any reason to support anything else.
For example, Oracle has sequences for this purpose and they perform and scale much better than selecting new values from table (at least when implemented and configured properly). But since some databases don't have sequences, they're obviously not the most portable solution. These two goals go somewhat against each other.
In the end, it depends on your needs. If you need the most scalable solution (say, thousands transactions per second), you'll probably have to lean towards the performance and forfeit the portability. If you'll be doing just a few transactions per second, portability might be more valuable to you than performance.
Scott's article about key generation might help you there, even if it doesn't concern Hibernate: Database Key Generation in Java Applications. The application key generators described there might be a good compromise (perform nearly as well as sequences), though they do need some setup first.