Creo que MVC, ASP y su marco de registro / manejo de excepciones favorito pueden manejar sus objetivos bastante bien. ELMAH y Enterprise Library proporcionan un manejo y registro de excepciones fácil de usar, así que elige tu favorito ... No voy a entrar en los pros y los contras de cada uno aquí.
NOTA: no puede mostrar una página de error amigable Y devolver un HTTP 404 o 500 como sugiere su pregunta. Cuando devuelve una página de error amigable, el código HTTP devuelto a su navegador será 302. Esta es una redirección a la página de error amigable.
Páginas de error amigables
Parece que puede lograr sus objetivos con la buena configuración web.config que ha sido parte de ASP.net por algún tiempo. Usted menciona mostrar información de depuración cuando está en desarrollo y mostrar páginas amigables en producción. Puede usar la sección de errores personalizados de web.config para esto (Establecer CustomErrors = "Off" para mostrar información de depuración). Asumiré que está familiarizado con el atributo CustomErrors, si no, lea esto:
http://msdn.microsoft.com/en-us/library/h0hfz6fc.aspx
Si necesita una mayor granularidad de control sobre las vistas de error que muestra, utilice el atributo HandleError de MVC. De esta forma, puede elegir diferentes vistas de error para cada Acción / Controlador.
http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx
Registro de excepciones
Parece que quiere responder a todas sus excepciones de la misma manera ('Registrar errores y enviarlos por correo electrónico al administrador en producción'). Si este es el caso, su opción más simple es agregar código a
Application_Error (remitente del objeto, EventArgs e)
en su global.asax. Aquí es donde puede pasar a su marco de registro elegido.
Si desea más control sobre su registro / manejo de excepciones, entonces puede subclasificar HandleErrorAttribute y anular
OnException(System.Web.Mvc.ExceptionContext filterContext)
Este es otro lugar donde puede pasar a su marco de registro elegido.
https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror
Esto le da más control que la técnica Application_Error mencionada anteriormente.
En general, MVC le brinda una gran granularidad de control sobre cómo manejar los errores. Si no necesita este control, puede recurrir a las formas ASP.net de hacer cosas como definir páginas de error en su web.config.