So you deploy a new contract and tell users why they should update. Then they can choose to use the new version or not. I don't think you really understand this idea.
You might find these two blog posts useful:
1. OpenZeppelin’s post on the Ethereum proxy pattern: https://blog.openzeppelin.com/proxy-patterns/
2. USDC’s adventure in upgrading their contract: https://blog.coinbase.com/usdc-v2-upgrading-a-multi-billion-...