There's also the fact that most companies will just ignore you. HP seems to be fond of this--sending out "anonymous" surveys to get feedback on what could be done better, *mandating* a response, then promptly ignoring feedback and doing what they've been doing all along. It's a cheap "empowerment" tactic to try and raise employee morale, which basically does the opposite because we all realize that no one pays us any attention and we're even more powerless than we thought.
And for all the threat of firing, surprisingly few people are actually fired in my experience. We have a lot of dead wood in our ranks--people who frankly shouldn't be here and who I resent because they're incompetent at best and lazy and malingering at worst, and they're taking up positions that could be filled by competent people who are currently unemployed. I personally would have thought that times like this would be an excellent chance to thin the herd and replace them with competent employees, but that's not how it works in the real world.
1. Firing people is a pain in the ass. There's a lot of paperwork, there's the ever-present threat of litigation, there's the case you have to make to HR to cover the company's ass, etc. If you work in government or in a unionized environment, it's even more complicated and time-consuming.
2. Firing people tends to kill morale. Unless the person in question was such a colossal fuck-up that everyone else saw it coming, firing a person (especially from something like performance rather than a violation of code of conduct or similar) gets everyone else worried that they're next. You might get a short-term burst of productivity as people work their ass off to show that they're really valuable after all, but long-term you'll lose productivity as people get depressed, fatalistic ("They're probably gonna can me anyways, so fuck it...I'm not going to break my back for them"), spend their time looking for other jobs, etc. You especially see this if it's a round of layoffs as opposed to a single person incident.
The ironic thing is that you often see a drop in morale and productivity among top performers when you don't fire people who are obviously subpar, especially if there's also limited or no increased compensation for those top performers. YOu wind up with your best people saying, "Well hell...if I can do half as much work and constantly screw up and STILL keep my job and get paid like Bob over there, why am I bothering?"
3. Finding replacements is an even bigger pain in the ass. Despite (or perhaps because of) the large pool of potential replacements out there, it's an enormous amount of work to go through the horde of resumes and applications you're going to get when you list a job opening. Then the interviews, the meetings with HR, the followup interviews, and the actual finalized hiring and onboarding process. And if new guy turns out to be a bigger bust than the person they're replacing, it looks bad on the manager.
4. Managers keep a certain amount of useless employees as "cannon fodder". Chalk this one up to the insanity that is corporate politics. Let's say a manager takes it upon themselves to trim down their staff by eliminating people who aren't that useful, and then HQ comes along and says "We need to save money. All units must shed 10% of their staff." They don't consider the previous firings in their calculations. So now the manager who has already made his unit leaner and meaner by getting rid of the dead wood has to get rid of people who are actually useful. By keeping a few subpar people on staff, they've got a buffer of easily disposable staff that can be sacrificed to save the jobs of those that are actually needed. Which is kinda insane, because it follows from that that at least 10-20% of payrolls are filled with "padding" whose main role is to take the downsizing hit for the people who are actually working hard.
With all that, it's not surprising that it's actually pretty difficult to get fired unless you're in a single-owner small business.