To bring another example, in Java all method calls on objects are virtual, i. e. indirect, however the code might be optimized at runtime, which I believe can involve de-virtualizing method calls and also inlining small methods. But Java has limited hotswapping support.
Another option would be to load the new code for the function into yet unused memory, then replace the old code wirh a jump to the new code. This way, only patched functions require a jump.
Editing data structures at runtime is much harder. Basically the address of each object might change. Not only does your environment need to handle the change correctly (if objects can be allocated on the stack, you might need to rewrite the stack in addition to patching up the heap), the programs running inside it must be robust against such changes at any time. This makes low level memory access unsafe and it should probably not be allowed in your environment.
Regarding your last point there have been some efforts to build text editors or rather AST editors, which support or sometimes exclusively rely on higher level commands, such as 'add field', 'add parameter to function', etc. However these editors did not catch on yet.