Yes, this is quite easy to do with apache's mod_proxy. As you suggested, I'd move tomcat to port 8080 or something and then have apache listen on 80. Likewise, say you set sinatra to listen on port 8888. Then in apache, you do something like this:
<Virtualhost *:80>
ServerName domain1.com
# Proxy through to tomcat, listening on port 8080
<Location />
ProxyPass http://localhost:8080/
ProxyPassReverse http://localhost:8080/
Order allow,deny
Allow from all
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerName domain2.com
# Proxy through to sintra, listening on port 8888
<Location />
ProxyPass http://localhost:8888/
ProxyPassReverse http://localhost:8888/
Order allow,deny
Allow from all
</Location>
</VirtualHost>
(make sure that mod_proxy is installed and enabled)
When that's complete, you should be able to enter domain1.com (assuming that you already have DNS record for that pointed at your server) in your browser and apache will proxy through to tomcat listening on 8080. Likewise, domain2.com will be proxied through to sinatra.
I'm sure that this could be done easily with nginx, haproxy, or something else quite easily. I don't have experience with those, though, so you'll have to look elsewhere if you want to go that direction.