In most distributed systems code deploy is never an atomic process. Thus, while new code is getting rolled out you have minutes, if not hours where both old code and new code are running side by side, both receiving traffic.
This means new code has to be backwards compatible with previews version even if you don’t plan on rolling anything back.
This is why having a rollback button makes sense, and why pretty much everyone has one. Rolling back to previews version has to be safe, otherwise you have already screwed things up while doing a rollout.