No practice is totally good or totally evil, always depends on context. But some practices are more evil than others.
For a quick
.jsp where the Java code is embedded in the HTML template directly, Java methods returning bit of HTML is OK. But for anything bigger than quick hack it is evil, because it is difficult to maintain.
The problem is that in larger application you want somebody to focus on the web design and other team members to do the backend. And for the designer it is easy to understand a decent templating system, but they will have big problems hunting down the snippets of HTML generated in methods buried deep within the backend.
The other problem is that you want the templating system to ensure a sane template leads to sane result. I am not sure what would be it's Java equivalent, but e.g. Genshi (python) checks that valid XML goes in and ensures valid XML goes out by automatically escaping all strings it interpolates and only accepting bits of HTML/XML as XML objects that contain the tree representation and therefore are always well formed. Such template system goes a long way towards avoiding cross-site scripting and similar attack opportunities.