The problem is not so much complicated pricing as grandfathering existing customers every time pricing changes (generally considered a best practice to avoid pissing off your customers). Then you end up with lots of gnarly conditional logic around anything that touches billing because you have to support a bunch of different pricing/billing versions, different upgrade/downgrade paths, etc. It gets even worse if your pricing model changes, like you go from tiers to per seat or usage-based.
You could just never change your pricing, but you’ll almost certainly be leaving significant money on the table as you’re highly unlikely to get it right on the first try. It could even kill your business, since the right product with the wrong pricing can be as much of a non-starter as the wrong product. Iterating on price can be as important as iterating on the product.