Si vamos a usar un servidor Java EE (perfil completo) para implementar una solución, recomiendo utilizar todas las funcionalidades que vienen en la especificación: EJB, JPA, JMS, etc. Pero hay veces que no podemos contar con un servidor de ese tipo ya que, por ejemplo, el cliente no conoce más allá del Tomcat, o no exista gente que podría administrar un servidor como GlassFish, Payara, Weblogic, etc. Entonces, llegamos a extrañar las funcionalidades dadas por Java EE, y optamos por otros frameworks que sí nos ayudan en nuestros momentos de limitaciones de servidor. Spring ayudó mucho desde un inicio cuando no se contaba con servidores Java EE OpenSource completos. Caló tan fuerte entre los desarrolladores, que practicamente se ha hecho un "estándar" alterno a Java EE. Cuando los arquitectos de Java EE "despertó" y mejoró las especificaciones en la versión 5, pienso yo, ya era muy tarde. Tomcat siguió siendo el servidor "estándar" para aplicaciones