In my research I found the two to be nearly identical. In my case I was mostly working with
WebRequest classes and in fact most of the TAP methods (e.g.
HttpListener.GetContextAsync()) are just wrappers of
Task.FromAsync on the APM methods of the same name.
I did notice a very small increase in memory allocations for the
Task<T> that captured the result objects, but it was very difficult for me to compare those against the memory allocations with the
IAsyncResult (just because the patterns are so different it was difficult to make a comparison). But as I noted the overall process memory usage was very slightly higher under the TAP pattern.
Alternatively, the CPU usage/consumption seemed to be completely identical between the two models.
The main difference was the significantly simpler code and simpler debugging of the code that the TAP offers.
Again my research was very specific to my use case, so I don't want to propose these results as the answer to the general question, but hopefully someone finds my research useful in the future.