Respondendo a pergunta do tópico, diria o seguinte:
Onde não usar: input/output de dados (WEB), procuraria uma alternativa, pois JAVA não é a melhor opção, aconselho Grails, se integra muito bem com JAVA, muitos falam bem do Play, RRails, mas não os conheço, “ainda”.
Onde usar: tudo aquilo que não precisa de interface (Processos/Controle de transação).
Uma aplicação web, geralmente tem um input/output de dados, dados que são persistidos em algum lugar e depois, costuma-se pesquisar e dar manutenção nestes dados, este cenário, acredito que seja de 80% das aplicações que a maioria um dia já fez, JAVA não é a melhor opção, pois toda parte de infra (configurar o ou os “ns” frameworks) acaba gerando um desgaste, não adiana alegar que é feito uma única vez e depois não se faz mais que não é verdade -> ex. uma classe, uma dao, uma pesquisa diferente, um método novo no repositório ou seja lá onde for (repositório, dao, entidade, services, está vendo como se tem trabalho) e toda esta parte (infra) pode muito bem ser abstraida por algum framework que cuide disso.
Um problema que a maioria dos desenvolvedores JAVA tem, é escrever HTML, CSS, JAVASCRIPT e montar telinha como se diz por ai, tudo que facilitar neste sentido e tornar o desenvolvimento mais ágil, deve-se ser analisado com carinho, quando conheci o VRaptor, comecei a ver vários problemas no Struts (1 e 2), pois ele passou a cuidar duma série de coisas que tinha que fazer na mão, mas ainda tinha toda parte de interface, códigos repetitivos (controller/view) que tornada o dia-a-dia chato e improdutivo, então comecei um projeto em Grails, quem já conhece, sabe o quanto a produtividade sobe com este ou framework que segue a mesma linha.
É uma pena que os responsáveis por projetos, se negam a utilizar estes frameworks, concordo que mão de obra qualificada é difícil, mas infelizmente esta é a realidade de vários segmentos, então se é para investir em qualificação, por que não fazer de algo que seja mais produtivo?
Espero ter ajudado…