http://petermoulding.com/drupal_versus_write_your_own_code
There are two questions that I think are easy to conflate here:
1. This is a content-based site; should I use an off-the-shelf CMS like Drupal or write my own?
2. This is not a content-based site; what should I do?
To me the answer to the first question is a no-brainer: the advent of free CMSes like Drupal and Joomla have made the concept of a CMS into commodity software. Although the ease of customization of Drupal has sometimes been overstated, I find it hard to believe people who claim that, even with customization, they couldn't get at least one off-the-shelf CMS to do what they wanted for their (often quite straightforward) site; it's worse when that's followed by the second claim that their experience meant it was a good business decision to build an entirely custom offering. In short: custom CMSes make me want to weep!
Even if you don't choose Drupal, there's very rarely a use case for writing your own CMS for a CMS-driven website: after all, what fraction of organizations would propose to write their own word-processing software to put together a spreadsheet, rather than e.g. bodging the requirements with macros?
Answering the second question is much trickier. Drupal, especially if you embed it in a well-tuned LAMP stack in preparation for high traffic, is optimized (very broadly) for delivering managed content. User interaction is best kept at a minimum for performance, as otherwise you start to find yourself jumping through quite narrow hoops (Varnish edge-side includes, anyone?) to get the site to be both performant and interactive for each and every site visitor.
Even then... as you move away from Drupal, you find yourself either having to adopt a lightweight web framework, or having to spend time rewriting even simple things like drupal_not_found(), drupal_add_js() or user_access(). Who really wants to have to wrangle HTTP headers themeslves? And yet, the more a site looks like a blended content/application offering, the harder it is to make the call. Splitting the site build up into smaller features, and building it in a way that lets you make that call on a feature-by-feature basis, is one way to forever postpone that decision; maybe having a framework like Symfony in core to call upon is another way.