With Virtual Machines, you use external IP address (Input Endpoints, or Instance Input Endpoints) for external communication. The former is load-balanced, while the latter is direct-mapped to a specific virtual machine instance.
Within a cloud deployment, you may have several Virtual Machines. They may each talk directly with each other via IP / port. Each virtual machine will be assigned an IP address local to your cloud deployment's network (that is, the IP addresses are local to the deployment; you cannot talk with anyone else's VMs, unless there's a Virtual Network configured).
The advantage of direct IP internally: You don't need to enable any type of security. For instance: if you have a WCF service that you only access internally, you won't have to worry about SSL, certificates, etc.
One clarification on performance, from @Eilistraee's answer: There's no penalty for communicating with the external ip address. While the request does get routed to the data center's edge, your call won't actually leave the data center. Furthermore: As long as your communication is between VMs in the same data center, there's no outbound traffic costs.
Now: With Web/Worker roles in Cloud Services, you do not have carte blanche to talk to any IP address internally. Rather, you define specific Internal Endpoints, which ultimately map to a specific port on your web or worker instances (and each instance of a web or worker role will listen on that same port, though your code will have to manually choose which web/worker instance to talk to on that internal endpoint).