We use the Azure PaaS platform. We use Cloud Services (stateless web app servers built from a config file that you specify), Azure Storage (including Blob, Table and Queues) and Azure Infrastructure (stateful virtual machines). We use Cloud Services wherever we can and avoid using standard VM's when possible. Cloud Services are very scalable, but you have to develop your web apps to work in the Azure environment to take advantage of the various features. Azure is a great platform to build something new on. It will be harder if you are trying to modify an existing web application to run in the Azure Cloud. The Storage services are very reliable and work extremely well. The Table Storage service is very, very fast.
The caching solutions are not very good. Their first caching product was called "Shared Caching", which was based on Microsoft's AppFabric Cache product. It didn't work very well as a cloud implementation. Then came their "in-role" cache, which works great but cannot be used when you need to share a cache amongst multiple web roles (servers). For example, want to cache your session information? You can't do it with an in-role cache, only a shared cache scenario will do. Also, in-role cache is tied to the specific Azure deployment you have running. If you redeploy your code, such as to fix a big, you end up redeploying our cache too, which has the effect of clearing out information in the cache. If you store session in cache, then your customers have to login again. The beauty of the shared cache is that it is independent of the deployment, so it never loses its data because of a deployment of your web services. The new "Cache Service" is suppose to solve all of these problems, but as of 3/3/2014, it is still in Preview status.
The Cloud Services Load Balancer is very limited. This is the "network load balancer in the cloud" that Microsoft uses to distribute web requests to your web servers. Unfortunately, it only supports round-robin load balancing at this time. I would like to see more options. However, it does automatically stop sending traffic to web servers that are non-responsive or are being rebooted, etc.
The PaaS "Cloud Services" that Microsoft offer have the greatest value. These are servers that run your applications and are built on-the-fly based on a configuration you provide and run your ASP.NET code. Using IaaS is just another form of co-location.
Also, if you can afford the $1,000 per month price tag, the Professional Direct Support subscription is very good.
When using Cloud Services, be sure to run multiple instances (servers) of each Cloud Service. That way you will qualify for the higher SLA. Microsoft reserves the right to reboot any of your Cloud Service instances at any time for any reason, but if you have multiple instances running, they will automatically be put in different "availability zones" so that they won't be rebooted at the same time. The servers get rebooted at least once per month to boot off of a new OS image that includes that month's Windows Updates.
From a pricing standpoint, you will get the best discount if you enter into an Enterprise Agreement with Microsoft, but this requires you to pay up-front for your estimated usage. You also lose some of the flexibility of the Azure Marketplace, as that is not available to EA customers.