It's actually faster than Velocity now, and more flexible. I still like Velocity's syntax better, but the newer JSP spec adds the ability to do ${some.variable} without an accompanying <c:out tag. Small improvement, but nice nonetheless.
Spring is a lightweight container. The big deal is the automatic bean configuration. This is the real magic. Set your datasource up for testing. Change it to JDNI for release. Or use a local datasource for some stuff, a JNDI source for others. Declare your transaction boundaries no matter what's using what. All without the overhead of EJB.
However, all of the other stuff builds on that. You use the bean config to map URIs to controllers, etc. There's no special syntax in the config file like Struts has; it's very dynamic and flexible. The view portion basically says, "I don't care how you render. Here's a model in the form of a map." The various view types (Velocity, JSP, etc... I just made one for a charting engine) take the model and change it into whatever that engine requires: servlet request attributes for JSP, VelocityContext for Velocity, DataSource object for the charts. Then the result is passed off and away she goes. So no, it doesn't have it's own templating engine. Just a generic view rendering system. There's also stuff that maps the views by name to various renderers, so you can just say "render this with the 'foo' view" and the bean config takes care of mapping that to a JSP or whatever. You can also just create a View object on the fly and pass that instead of a string.
There's also stuff like an exception-free JDBC library (verra nice) and other nifty things.
Which brings up another point: almost everything in Spring uses unchecked exceptions. No more catching endless SQLExceptions if you don't want to.