The main disadvantages are more complexity and performance issues.
Examples:
- Event sourcing: https://youtu.be/8JKjvY4etTY
- CRDT
- At the DB layer: https://www.datomic.com
- You can also do it at the code level (but this is more like keeping copies of the old state): https://immerjs.github.io/immer