We've been in a similar situation and what we ended up with was essentially use synchronous SOAP classes generated by CXF and call them inside a executeBlocking context.
It sort of works, but it does have a huge drawback that since the call to backing SOAP service is synchronous and is using blocking http client implementation, it very quickly exhausted default open file handles limit.
Creating a completely asynchronous SOAP implementation on top of Vert.x HTTP api was way out of scope for our team/project, but I found myself wondering many times if such a library/extension to Vert.x would be a worthwile investment of time and resources...