We use UDT's extensively, and the performance is marvellous. UDT's are marshalled efficiently across process/machine boundaries too (they are well defined in IDL, too) Unfortunately, if you need to use ASP (and IDispatch) it will not be able to read the UDTs: using UDTs you will also be stuck with IUnknown (unless you implement all sorts of redirection classes) Depends on what you want, though.

You should avoid cross-process/machine communication (in the VB COM world) using any form of VB created object - including collections. They are not marshalled efficiently - there are exceptions such as the ADO recordset object which uses custom marshalling, but you cannot implement custom marshalling in VB. So avoid objects across any sort of boundary.

I'm sure that XML is probably the most independant way of doing things. HTML is a good wire protocol too - but you lose a little performance - the performance loss isn't linear though; XML based comms tends to be very scalable simply because of the way you have to code things. It's also very simple to convert an ADO recordset to XML (persist as XML!!) of which you can pass to the ASP response object (it supports IStream) which means no custom coding to deal with XML.

The choice is yours - I hope this helps a little