Going with your plan I'd take this approach:
- You're going to write all the performance data to a log file. Use one of the fast C# log libraries like log4net or nlog. These frameworks support binary appenders if necessary.
- When the app starts write the available RAM, CPU, etc.
- Use an aspect injector like PostSharp to automatically add a timer to every (non-inline) method in your app. The Stopwatch class won't make a significant performance hit. To make this configurable have the aspect injector change the log level according to the estimated priority of the method (or use your own attributes to specify that).
- Prompt the user at exit (or start) to send the recorded performance data to your webserver.
- Zip the data on its way out.
You may also want to consider writing your own lock class. Instead of using lock(blah) or Monitor.Enter(blah), wrap up Monitor.Enter/Exit in your own disposable class that logs how long you had to wait to enter the lock.