1 - Que eu saiba você não pode usar o hibernate.cfg.xml, você deve incluir as suas entidades na configuração do bean sessionFactory mesmo.
2 - O HibernateTemplate faz uma camada para abstrair o uso da Session, que traz uma série de vantagens, tais como o gerenciamento da Session e conversão das exceções específicas do hibernate para exceções do Spring ORM (HibernateException, nesse caso). Suas outras opções são extender a classe HibernateDaoSupport, aproveitando os métodos que ela traz, e a própria utiliza também o HibernateTemplate (o qual você não precisa usar diretamente), ou simplesmente injetar a SessionFactory e administrar o uso da Session você mesmo, o que eu não recomendo, já que você perde as vantagens do gerenciamento de sessions que o Spring te proporciona (não é necessário session.close() e etc). Recomendo que você utilize qualquer um das outras opções, especialmente lidar apenas com HibernateTemplate. Se sua necessidade de usar a Session for relacionada à criação de Queries e Criteria, recomendo que estude como usar a interface HibernateCallback, que deve suprir essas necessidades.
3 - Se permitir que o Spring gerencia para você (recomendo! :mrgreen: ), não vai mais precisar do HibernateUtil.
4 - Não há necessariamente o mais indicado, isso depende do seu ambiente. Se você tem controle direto do servidor e da aplicação, a forma que você fez está adequada. No meu caso não posso fazer assim, pq aqui na empresa não posso definir senhas para o banco de dados, outras pessoas cuidam do servidor, então a configuração é feita via JNDI.
Espero que tenha esclarecido um pouco mais! Flw! :thumbup: