The stack is too heavy for Mono, which currently lacks a generational garbage collector ... which wouldn't be such a problem if libraries would be designed with Mono in mind (libraries designed for Mono don't have problems).
So yeah, you can run ASP.NET MVC on top of Mono, but it will leak memory, the server requiring periodic restarts.
When people say "you can run ASP.NET on top of Mono" they never have an example of a visible website / web service that does that.
Also, doing asynchronous I/O on top of Mono using the model available in System.Net.Sockets is flawed on Linux, because that paradigm is based on true async sockets available on Windows ... but on Linux it's emulated with ThreadPools.
A good and scalable server for Mono would be one using async paradigms available on Linux (like bindings to libevent or other libraries, like something that calls vmsplice/splice to send/receive data). It would also have to be throughly optimized/profiled such that it relies as much as possible on stack allocations and to be careful about heap-allocation patterns, such that it doesn't leak through memory fragmentation.
Also on speed ... using ASP.NET MVC you can currently handle 500 requests/second for a simple "hello world". This is simply unacceptable ... using Java you can easily reach 3000 r/s, and this by using a regular servlet-compliant synchronous server (by using stuff built on top of NIO, you can reach 15000 r/s). It is unacceptable because ... what's the point in using a compiled language with a smaller community, other than getting raw performance out of it?
Again, this could be solved with libraries designed for Mono. But unfortunately not too many people are interested in Mono as a web development platform.
Unfortunately it's missing a web stack; ASP.NET sucks on top of Mono.