First off, let's just get some raw numbers in here so I don't have to hand-wave the rest of this. In the past year on Stack Overflow 2,822,242 questions were posted, and 307,870 of those were closed. Out of those...
- ...190,330 were deleted
- ... 44,323 were closed as duplicates
- ... 6,654 were re-opened
- ... 75,905 non-duplicates remain closed but not deleted
Duplicates are sort of a special case: they're not necessarily questions that are inappropriate, they're just questions that were already answered - so closing them and leaving them around helps to provide future readers with a path toward that existing answer, even if they're searching for terms not found on the original question. We generally don't want to delete them for this reason (although there are exceptions to this).
As you can see, the majority of closed questions - and generally-speaking, the worst of the worst - are deleted:
Why would you delete a question? Isn't closing it enough?
- Some questions are of such poor quality that they cannot be salvaged. They're literally nonsense. Not every byte of data that is created in the world is infinite and sacred.
- Some questions are so incredibly off topic that they add no value to a programming community.
- The mental cost of processing these closed questions is not zero, particularly for users who are actively engaged and scanning questions to find things they can help answer.
- If users see a lot of closed questions, they'll note that we don't enforce the guidelines, so why should they? Without any final resolution, asking questions that get closed becomes something we are implicitly encouraging -- a broken windows problem. If this goes on for long enough, we're no longer a community of programmers who ask and answer programming questions, we're a community of random people discussing.. whatever. That's toxic.
- If enough of these closed questions are allowed to hang around, they become clutter that reduces the overall signal to noise ratio -- which further reduces confidence in the system.
Let me be clear: we do not seek out deletion, by any means. But we believe not having the guts to cull some of your worst content is much, much more dangerous to your community than letting it sit around forever in the vague hope that it will magically get better over time.
If there's a reasonable chance that a given question will be useful to other programmers, it's worth giving it a chance: closed questions can always be edited and re-opened, regardless of age, if it turns out there's sufficient value in doing so. The important thing is to get as many of the lost causes out of the way as quickly as possible, so that folks can find and focus on those potentially-useful ones. Some of this can be (and is) done automatically, the rest rely on trusted members of the community reviewing and voting. All in all, I think we do pretty well.