You can create your own custom performance counters and use them.
All exceptions can also be handled with your own log facility that handles the performance counter aspect and logs the exceptions in the appropriate windows event log as well.
It was not a gigantic undertaking as far as I remember when we implemented it and from that point on you can use almost any tool to collect and analyze data, find correlations between counters, etc. (It is nice to have e.g. CPU/Disk/network utilization and method call info on the same chart in perflog.)
As for method call times, it can be implemented by making use of QueryPerformanceCounter in a custom sink if you have a remoting solution or some custom binding if you are working with WCF.
I guess you can easily find great resources on all topics - creating a custom perf counter, using QPF to time method calls, creating entries in the system logs with custom sources, using custom bindings for various purposes, etc. - with some research.