That's what I've opted for as well, and I have to say I prefer it. gdscript is a nice language for high level game scripting, and on the couple occasions I needed to bring in some high-performance code I found it super easy to build a gdextension in Rust.
Compile the engine from source and add your classes as a module. Cuts out all the gdextension glue code and then you don't need to ship a shared library.
No. Your game code is a new class, in whats called a module, which is fully supported by the engine. Your game code almost definetly relies on the same stable APIs that a GDExtension or GDScript itself uses. There will be no merge conflicts, no problems, almost certainly.
Note: We have a fork of godot that has some changes and fixes weve made and engine upgrades are still a breeze. Solving the odd merge conflict is not that hard, people do it all the time. Godot's code base isnt drastically changing from day to day. 3->4 only had significant impact if you were doing certain things with the 'visual server'... other than that even that was easy.