Here's a creative idea that requires some overhead to maintain, although not a ton, but does allow you to use just one single external IP:
I'm not sure how big you are on networking, but at least on a Cisco ASA, you can accomplish this by using static NAT statements.
1. Configure your ESX host to accept traffic on port X.
2. Configure your VM to accept traffic on port Y.
3. Setup NAT rules similar to these on whichever device you are using for routing or NAT'ing:
static (outside,inside) tcp <external_ip> <port X> <ESX_host_ip> <port X> netmask 255.255.255.255
(send traffic destined for <external_IP>/port X (ex: 80) to the ESX host IP)
static (outside,inside) tcp <external_ip> <port Y> <vm_ip> <port Y> netmask 255.255.255.255
(send traffic destined for <external_IP>/port Y (ex: 8080) to the VM IP)
Notice that the traffic is all going to the same external IP, but it is being NAT'ed to a different machine based on the destination TCP port!
By specifying the 'tcp' flag in your NAT statements on the Cisco commandline, it lets you NAT based on TCP port number, not just IP address. So, if you can configure your host to use one port number and your VM's to use another port number, you can successfully use NAT with just a single IP. The downside is, of course, that you'll need a different port number for each VM as well as a different NAT rule.
It's a creative idea that will definitely work, but it requires some network expertise to get going. Enjoy!