One thing to also note is that Fred Brooks has stated that his "Throw one away" idea was wrong. He now says, "I would now recommend this for bad teams only. Now, I suggest you make schedules on previous experience of your team. My new approach: INCREMENTAL SE, i.e. build a small functionally limited but working system and then expand it."
If the company is maintaining the old system to support existing users, that's a bad sign for the rewrite. If there is a separate team for the old system, that's a really bad sign for the rewrite (not to mention for the company).
Doing this is harder than it sounds. Technical success may be a necessary condition but it isn't a sufficient one.
Also, thanks for writing this up - lots of good writing as usual. Having gone through a rewrite recently, and being asked to consult on another, you've identified a lot of good issues for me to revisit.
For example, a large legacy application in operation for over a decade with a huge volume of customer data is completely different monster from a smart phone app. Re-writing it in another language is a pain in the ass and if you're really, really successful nobody will notice the effort you put in. It won't make you any money or friends.
Still, there are times when it's just necessary. Even large legacy applications can be replaced given the right parameters. You can write an interface layer to the old code and extend it in a new language. Write an exhaustive amount of unit tests and acceptance tests against the legacy wrapper API and slowly replace the legacy code behind it with new code that is better written, faster, and more reliable (or what have you).
I think the most salient point of this article is to know what you're re-writing. Good acceptance tests and functional tests will help A LOT in making this decision.
Really? Wow. :-)