You’re completely misunderstanding the concept of Properties. The purpose of a Property is not to have a trivial getter and setter (ie. ones that exist only as pass-throughs to the underlying field.) It’s to have the option to put a getter and/or a setter, either or both of which could be trivial or non-trivial, and have the consumer not know the difference or need to care about it. (Aka encapsulation!)
You’re proving my point for me: there is no guarantee, so you have to do it all yourself, manually. There are two problems you don’t see.
First, your “even when” scenario is not an “even when” scenario at all. Working alone on a codebase of 10k lines of code, however “complex and demanding” they may be, is the basest of baselines. It’s easy to get that right: that’s small enough to hold the big picture in your head. The systems I was talking about measure in the millions of lines of code and were developed over double-digit numbers of years by teams of double-digit numbers of developers, many of whom are no longer with the company and so you can’t ask them what their rationale was for doing this part here the way they did it. The mental demands are very very different at that scale.
Second, errare humanum est. Having rules to do things right work just fine as long as you follow them correctly. It’s that one time you forget or make a mistake (maybe because you’re working with a C API that doesn’t use references, like SDL?) that gets you. And then bad things start happening. Because you can make those mistakes. Because the language does nothing to prevent it and puts all the burden for getting it right on the fallible user.