I thought we were talking about internal IT working on internal products. In those cases I think iterative development is far better in nearly every case. For packaged software you obviously need something else. But even in an environment where deployment costs are high you can do an iterative development model. Do iterative development onto a test platform, when it's "ready" you deploy it. The real difference is how far in advance of the release you have to announce the final spec, and how you define "ready".

The one case where I wouldn't really question waterfall is a case where there is no internal IT, and the staffing will be put together on a per-project basis.