Considerando apenas aquilo que eu presenciei (afinal, tem de tudo), os códigos de web escritos inteiramente em servlet costumam ser confusos, pois tem que digitar código web em vários println, além de alguns programadores sem conhecimento em MVC acabarem bagunçando tudo. Não é o pior, tem aqueles que resolvem fazer tudo em JSP e coloca uns “cabeçalhos” nas páginas com código java pra fazer a lógica do negócio.
Acho o JSF ótimo, gosto da orientação a componentes que ele possui. É claro que tem alguns defeitos, como não aceitar requisição GET, mas se isso não for problema, vá em frente.
Existem além do Hibernate, o JPA, que seria o “standard” do Java, mas não considero tão maduro (essa palavra tão confusa!), portanto fique no Hibernate mesmo.
Se não existe nada muito AJAX na sua aplicação, não se preocupe muito com as bibliotecas de componentes para JSF. Quando houver uma necessidade de alguma requisição que precisede algo “assincrono”, aí você usa.
Se você usa relatórios, poderia usar JFreeChart, e existe um plugin de JSF para acessá-lo. O JFreeChart é ótimo, mas não tive experiência o plugin, portanto é por sua conta e risco.
Uma recomendação final, se a aplicação está funcionando bem, não faça tudo do zero, faça o seguinte:
- Separe a camada de negócio da sua aplicação em classes que não dependam de HttpRequest e HttpResponse, coloque até em um jar separado.
- Crie wrappers em cima dessas classes do jar como classes POJOs, ou seja, getters e setters e mais alguns métodos sem parâmetro que realizam alguma ação, como por exemplo: listar(), salvar(), enviarEmail(), exibirRelatório().
- Nos wrappers que acessam o banco, faça uso do hibernate. Nos relatórios, faça uso do JFreeChart (use DAOs se for o caso).
- Troque a camada visual pelo JSF e chame os wrappers que foi criado para realizar a navegação.
Onde cada item acima seria um projeto executável.
Ok?