I think not firing someone is a much bigger hit on team morale. If someone is either doing something that affects everyone badly/not doing what they're supposed to do (causing other people to do their work), why keep them? Firing is a temporary downer; keeping someone on staff who shouldn't be there is a long-term one. If your team is great and they care (which I think all great teams do) you owe it to them to replace that person with someone who is on the same level.