Bom, vou tentar me restringir à Web…
Algumas coisas que devem ser levadas em conta antes de escolher um Framework Web:
-Primeiro é o tipo de aplicação que você está desenvolvendo. Se for um software interno para uma empresa, pensar em componetização pode fazer sentido, pois a flexibilidade que se ganha ao reutilizar estrturas, armazenar valores até mesmo uso de AJAX pode ser simplificado. Nesse âmbito você está olhando para Component Based frameroks, que pode ser Tapestry ou JSF. A escolha entre um e outro deve levar em conta mercado, conhecimento da equipe e blá blá blá.
Agora ao optar por um framework desse tipo, haverá complexidade para a equipe (caso não tenha experiência prévia) entender o ciclo de vida e mecanismos de persistência. Nesse ponto utilizar algo como Seam ou uma configuração do Spring + Hibernate + JSF pode fazer diferença.
Caso a aplicação necessite de performance , lembrem-se que até a presente especificação o ciclo de vida do JSF é stateful e já foi até pedido pelo Gavin que se reduzisse a complexidade do mesmo.
Mesmo você não persistindo o estado do componente, o JSF possui fases e há sim um ciclo que mantém estado. Isso pode acarretar em memory leak, quando a aplicação é consumida por um volume muito grande de usuários simultâneos.
A escolha do Framework precisa passar por um teste de Stress. Sugiro que se faça uma POC com um cenário denso e utilize um JMeter para testar a capacidade do seu ambiente. Conhecer o Business Plan da companhia ou do projeto, é fudamental para montar um teste decente.
Aliás a GlobalCode possui uma apostila gratuíta sobre Testes com Jmeter muito bacana, recomendo a leitura.
Se a opção for por frameworks Action Based , então você precisa pensar no que está desenvolvendo. Porte da aplicação é um fator fundamental. O Spring é um framework FullStack bem denso e complexo de se aprender, que só traz benefícios em projetos médios (minha ótica).
Atualmente com a nova confiuração via Annotations você ganha também em projetos maiores, antigamente era um inferno. A parte boa, que além do IoC , você possui estrutura para JEE, Segurança , controle transacional entre outras features.
Sistema de persistência também deverá ser ponderado. Costumo fazer uso da especificação JPA e à partir daí escolho o provider de acordo com as premissas do projeto. Se for flexbilidade, faço uso do Hibernate, aí fujo um pouco da JPA pois a mesma ainda não possui Criteria, Projectios e afins. Mas em muitos casos o principal motivador é performance, então uma análise de outros frameworks como Kodo e Toplink ( Oracle) podem fazer a diferença.
Projetos menores podem ser realizados com frameworks ágeis, como VRaptor que incorpora o pattern CoC, trará excelentes benefícios, embora sua integração com outros frameworks seja mais árdua, precisará escrever um pouco mais.
Saindo do mundo Java, existem framworks como Merb, Rails, Django mas aí são outros 500 