First of all, you can use a much lighter Servlet container if you have simple apps with lower BW. winstone is very basic, jetty is a good alternative for medium to large sized apps if you ask me.
All apps can of course consume vast amounts of resources and bring down the whole JVM. What I usually do is to throw all the well-behaved ones in one JVM, and give the nasty ones an JVM each. This especially applies to apps which assume that they own the whole JVM, calling System.exit() etc. You can also throw in some security constraints to prevent that, but this gives you very little IMO, you usually want the app to exit on error.
Regarding performance when having multiple JVMs is to set min heap size fairly high, limit max mem usage and play around with the GC algos a bit to tune each app. JBoss start up scripts have good examples there.
A really neat piece of software for managing all the JVMs is Upstart. It lets you set up respawn rules and define actions on crashes. If you don't have Upstart, you can always use inittab, although syntax errors in inittab can have grave consequences :)