I'd stay way clear of groovyws, it sucks.
After looking around I finally chose the solution of using spring web services and contract-driven web services.
The client instantiates command objects with a toXml() method that generates the soap request XML. Then use the WebServiceTemplate to sendToEndpoint.
For the server, we use spring web services endpoints. Parsing the incoming xml is child's play, and you don't need to marshal the XML into an object, as the GPathResult resulting from an XmlSlurper is totally manageable. Our server runs on top of grails, so we took advantage of the springws grails plugin, making the creation of Endpoints even easier.
There is one caveat though. The springws plugin for grails is out of date. Spring web services is now version 2.x and springws plugin comes with 1.4.x i think. However, it is very easy to use without the plugin, and I think that upgrading the plugin to the newer api is not hard.
Also, if you want to do MTOM, springws gets a little more complicated, because you need to dig deeper into the message handling. I was able to do some pretty advanced ws-security stuff with spring web services however, no problem.
Otherwise i would use cxf (handles MTOM nicely), if you want to stick with jax-ws et al.
The overhea is probably higher, because all the dynamically generated proxies and pojos.
Also, it is not contract-driven, which is a big plus for us.
http://predic8.com/groovy-web-services-jax-ws.htm
http://cxf.apache.org/docs/how-do-i-develop-a-client.html