Eu acho que o MVC, ASP e sua estrutura favorita de registro / tratamento de exceções podem lidar com seus objetivos muito bem. O ELMAH e a Enterprise Library fornecem fácil manuseio e registro de exceções, então escolha o seu favorito. Não vou falar dos prós e contras de cada um aqui.
NOTA: você não pode exibir uma página de erro amigável E retornar um HTTP 404 ou 500 como sugere sua pergunta. Quando você retorna uma página de erro amigável, o código HTTP retornado ao seu navegador será 302. Este é um redirecionamento para a página de erro amigável.
Páginas de erro amigáveis
Parece que você pode atingir seus objetivos com as boas configurações do web.config que fazem parte do ASP.net há algum tempo. Você menciona a exibição de informações de depuração no desenvolvimento e a exibição de páginas amigáveis na produção. Você pode usar a seção de erros personalizados do web.config para isso (defina CustomErrors = "Off" para mostrar informações de depuração). Vou assumir que você está familiarizado com o atributo CustomErrors, se não ler isso:
http://msdn.microsoft.com/en-us/library/h0hfz6fc.aspx
Se você precisar de maior granularidade de controle sobre quais exibições de erro são exibidas, use o Atributo HandleError do MVC. Dessa forma, você pode escolher diferentes visualizações de erro para cada Ação / Controlador.
http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx
Log de exceção
Parece que você deseja responder a todas as suas exceções da mesma maneira ('Registre erros e envie-os por e-mail ao administrador em produção'). Se for esse o caso, sua opção mais simples é adicionar código ao
Application_Error (remetente do objeto, EventArgs e)
no seu global.asax. É aqui que você pode passar para a estrutura de log escolhida.
Se você deseja ter mais controle sobre o registro / tratamento de exceções, pode subclassificar HandleErrorAttribute e substituir
OnException(System.Web.Mvc.ExceptionContext filterContext)
esse é outro lugar onde você pode passar para a estrutura de log escolhida.
https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror
Isso lhe dá mais controle do que a técnica Application_Error mencionada acima.
Em geral, o MVC oferece uma grande granularidade de controle sobre como lidar com erros. Se você não precisar desse controle, poderá recorrer às maneiras de executar o ASP.net, como definir páginas de erro no seu web.config.