Can you explain what your concerns are with Mono? I haven't used it but as .NET developer hoping to deploy some apps on Mono to cut costs I'd like to understand your criticism better. Are your concerns regarding performance, and within which area? Is it poor memory management and what consequences do you have in mind?
We went guns-blazing from .Net on physical Windows servers to Linux/Mono/EC2. Mono performance is okay -- we still run a lot of C# utility stuff on Linux with it, no problem (build on windows, push to s3, servers self-deploy).
Forget about web stuff though. Mono fastcgi is not production ready (lots of little things, the interplay of nginx and Mono's fastcgi server 'lost' some routes, particularly scriptmethods).
Mod_mono is better... until you start getting OutOfMemoryExceptions. My understanding of the problem is that the Boehm GC is non-compacting, and thus, unless you (somehow) craft your application memory use patterns perfectly, will run out of memory if you churn through enough allocations.
From the mono ASP.NET FAQ:
Why does the memory consumed by the Mono process keep growing?
Mono currently uses a conservative, non-moving, non-compacting garbage collector. This means that the heap is not compacted when memory is released. This means that applications can produce memory allocation patterns that will effectively make the process grow, just like C, C++, Perl, Python applications would.
It is hence important to not get into patterns that would create these holes, for example such a hole could be created if you create a block of size SIZE, release it, and then create two blocks of size SIZE/2+1.
ASP.NET in Mono is particularly vulnerable to this kind of memory problems because it is easy for developers to define APIs that transfer large blobs of data like entire image files, these would allocate a lot of memory that can easily be fragmented.
A simple solution is to try to write your software in a way that large data blocks are not allocated, but instead your application handles them in blocks (like writing a "copy" command).
So the new GC, S-Gen is available, but for us at least, ~6 months ago it was really buggy. Some of our code would inexplicably cause mono crashes in the allocator. We couldn't run our apps with it, at all.
So ultimately we were left with restarting our webserver process every 30 minutes or so, or we could switch back to Windows web servers. Mono was decently performant, but going back to Windows we had a slight but noticable performance increase.
Don't get me wrong, Mono is awesome for a lot of things, and it kicks fuckin' ass to run my C# on Linux. But the ASP.NET side of things is just not mature enough. It's possible I'm just a bad programmer and if I'd taken the time to re-architect our allocation patterns to play nice with Boehm this story would have a happier ending, but alas :)
P.S. None of this stuff is fresh in my mind right now, so shoot me an email you have more questions or run into any specific situations or whatnot.
I would want to deploy ASP.NET MVC3-based web applications so restarting the web server sounds like it'd be my only option (I'm not going to waste my time re-architecting things if it's eventually likely to run out of memory anyway).
Then again, I haven't tackled switching away from MSSQL (aside from learning to use a new DBMS, I'm a fan of stored procs too so I'd have to learn a new SQL dialect), either. Since my time is probably worth more than Windows licenses, it looks like sticking to Windows is the logical choice for now.
Thanks for the offer to pick your brain... I may take you up on it some time :)