By contrast waterfall forces most decisions to be made blindly, all but ensuring they will be very wrong, and only discovered after its much, much too late to do anything about it.
They've been doing it in civil and mechanical engineering for decades. That's what plans are for. They're cheap to change before you start building something. If your clients can't discover that you are going about it wrong, then you didn't give them sufficient planning documents. Try walking into a commercial building under construction and telling the engineers you hired that -- oops -- you want 12 foot ceilings instead of 8 foot ceilings, but you didn't realize that until you actually saw the building. Without hesitation, the engineering firm will whip out the spec that you signed and say, "well, that's not what you agreed to."
All Agile does is hide the true cost of allowing design changes at arbitrary points in the process. Whether with waterfall or Agile, changes are expensive. With waterfall, when you properly manage expectations and thus don't have to deal with significant changes, you know exactly what is required throughout the project -- redundancies, opportunities for abstraction, and overall design efficiencies are evident from the beginning -- so you save on cost AND build things efficiently. With Agile, on the other hand, those extra costs are already built in and unavoidable. You're never looking at the big picture, so design efficiencies are not always evident until part of the work has been done. The iterative builds and deployments take up valuable coding time. So even you DO properly manage expectations with Agile and don't keep chasing your tail with changes, the cost will be far greater, and the efficiency much lower, when all is said and done.