Скорее всего, вам понадобится комбинация подходов. Некоторые ошибки могут обрабатываться непосредственно в ваших моделях, другие - в ваших контроллерах, а некоторые могут нуждаться в обработке вплоть до уровня приложения (либо через web.config, либо через global.ascx.)
Я предпочитаю обрабатывать ошибки в global.ascx, а не через перенаправление в web.config, потому что в global.ascx у меня есть больше информации о запросе, который вызвал ошибку, где, как будто я делаю перенаправление через Интернет. В настройках конфигурации часть этой информации теряется к тому времени, когда моя страница ошибок получает запрос.
Несколько недель назад я только что заметил, что ошибки 404 лучше не обрабатывать через web.config, потому что это (по замыслу) вызывает код перенаправления HTTP 302, а не истинный код HTTP 404, который указывает клиенту, что ресурс не существовать. У меня есть пост в моем блоге, где я освещаю это подробно http://hectorcorrea.com/Blog/Returning-HTTP-404-in-ASP.NET-MVC
Использование ELMAH, как предложил Брук, также очень хорошая идея.