The hardest battles I've had are dealing with legacy code. The majority of teams want to improve the overall code base and correct past mistakes, but you can never fix everything right now. Deciding when to let the nasty thing lie and when to pay the cost of fixing something is a tough decision to make. Fixing costs are large and immediate but the cost of leaving a problem area is spread unknown across the future. Couple that with fixes that don't actually provide system value except for standardization and you can have all sorts of fun arguments.