I've spent a ton of time investigating the wrong problem because of the error message I received from the Upgrade Deployment API (http://msdn.microsoft.com/en-us/library/azure/ee460793.aspx).
The message is:
InvalidXmlRequest
The request body's XML was invalid or not correctly specified.
The actual problem was I was not appending the final slash to the request URI. I was calling:
https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/<deployment-slot>?comp=upgrade
When I should have been calling:
https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/<deployment-slot>/?comp=upgrade
It's terrible enough that the API is that sensitive, but it would have helped immensely if the service would have returned a 404 or something else meaningful related to the URI.