About half of the answers so far are addressing the flaws of confirmation dialogs, not of modal dialogs. While the vast majority of confirmation dialogs are modal, this does not mean that the two terms are synonymous.
A modal dialog is one which puts the program into a specific mode and does not allow you to do anything which doesn’t correspond to that mode while it is open. In the most common implementation, this means you can’t access any other windows.
This is evil.
Consider an address book application. Suppose you have an existing person in the address book and you wish to add their roommate.
- If the “add person” dialog is non-modal, you can flip back and forth between the old record and the new one copying and pasting your data.
- If the “add person” dialog is modal, you can’t do anything with the old record while the add dialog is open. You can select something to copy before selecting “add”, but just one thing. Everything else has to be manually retyped.
On rare occasions, you run into something which truly must be done in one piece without allowing the user to diverge from that task until it is complete. Modal dialogs are appropriate for such cases. But these cases are very rare! Which is basically the point of the other thread referenced by this question.