Olha, cada caso é único.
Você pode, se quiser, optar por usar apenas JDBC. Vai ficar realmente muito mais rápido, mas em contra partida, vai te dar mais trabalho pra desenvolver também.
Ou então, pode usar a seguinte alternativa: faça tudo com Hibernate. E em seguida, utilizando um profilador, encontre as consultas mais lentas e, nestes casos, utilize JDBC. Recentemente tive de fazer isto num sistema.
Havia uma consulta que levava 30 segundos para executar usando o Hibernate. Utilizando JDBC, conseguimos reduzir o tempo para algo em torno de 200 ms (!!!). No caso, esta consulta já preencha os beans utilizando o Hibernate (estávamos usando um objeto Criteria). O que fizemos foi apenas reescrever a busca que buscava pelos campos chave dos registros que seriam representados pelas entidades e, um a um, utilizar o próprio Hibernate para preenchê-los. Mantivemos assim neste caso a mesma produtividade que teriamos originalmente com a ferramenta.
Outra opção consiste em otimizar o próprio Hibernate. Você pode fazer isto utilizando por exemplo consultas em lote, desligando ou habilitando o cache secundário (vai depender do caso), dentre diversas outras opções.
(aqui segue um link do próprio Hibernate sobre como usar processamento em lote: http://www.hibernate.org/hib_docs/reference/en/html/batch.html)
Outra opção: utilize lazy loading (sempre lembrando: há casos e casos). Assim você não carrega todas as dependências de suas classes de cara e ganha alguma performance.
Agora, se é uma boa prática ou não, não sei te responder. O resultado final só depende de você.