This isn't tomcat specific but in general if you are splitting up a web application you'll want some way to share different state across the distributed pieces. You can do this with a database or memcached store for the session information, but make sure that each application can read the common session data (some frameworks will use a key to encrypt the session data and will need to all have the same key to read it). I don't think most cookie stores for session information will hash in a way that the cookie won't persist correctly between applications.
Breaking down by function makes the most sense. See where you can separate your backend code. If you have nice restful type urls, you can probably look at your URLS to help determine good partitions.
Also, if you have a large static section that you are updating separately, perhaps that should be served up by something other than tomcat.
For common classes, you could place class implementations in a jar in your tomcat/lib folder. They would be available to the entire server. They wouldn't be able to be tailored very well to your web context (unless you passed the context to them) and you would have to restart the whole server to update the jar file to get tomcat to reload it.
Perhaps you can work something out with interfaces that gets you more independence in each partition allowing them to compile independently in some way. Perhaps some Remote Method invocation would also help you move common functions to a single .jar or .war.