CALL and RET are exactly what x86 uses for every function call, and RISC-V's JAL/JALR and ARM's BL/BX instructions implement the same push-return-address-then-jump mechanism you build here. Return-oriented programming (ROP), a major real-world exploit technique used to bypass non-executable-stack protections, works by chaining together RET instructions exactly like the ones you're implementing.