What you'd need to do to get this to work would be to have a single one of the existing web servers (or a separate one that's dedicated to the task) be configured as a reverse proxy.
It would be responsible for getting the request on the public address and reading the host header, then proxying the request to the appropriate private address depending on the host that was requested.
Popular software packages for this task are Apache (you could use your existing instance), nginx, or HAProxy. There's plenty of information in questions here on configuring these appropriately ("reverse proxy" is the search term that'll get you there), but if you have a specific one of these software packages in mind then I can edit this answer with an example config.
Edit: example Apache config:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName apache.domain.org
ServerAlias www.apache.domain.org
# For this one, we'll imagine that you want to serve these resources from
# the local server. If you want do use a separate Apache instance instead,
# then copy one of the other hosts for this one.
DocumentRoot "C:\path\to\site\files"
<Directory "C:\path\to\site\files">
Order allow,deny
Allow from all
</Directory>
# Any other directives you need for the content here
</VirtualHost>
<VirtualHost *:80>
ServerName iis.domain.org
ServerAlias www.iis.domain.org
# Replace the URL below with the URL of the IIS server - make sure
# to keep the trailing slash.
ProxyPass / http://10.x.x.1:80/
ProxyPassReverse / http://10.x.x.1:80/
</VirtualHost>
<VirtualHost *:80>
ServerName tomcat.domain.org
ServerAlias www.tomcat.domain.org
# Replace the URL below with the URL of the Tomcat server - make sure
# to keep the trailing slash.
ProxyPass / http://10.x.x.2:8080/
ProxyPassReverse / http://10.x.x.2:8080/
</VirtualHost>