In effect, you have created an indexed return stack. It is hampered by the need to associate multiple return points with arbitrary numbers. It has the overhead of having to test the numbers, to match the correct return point. This cancels out any gain that you might have made from not having to place return addresses on the stack and pull them off (which is automatic on most processors). Note that you are not required to pass and return parameters from a function. You can use global variables. It is just convenient and aligns well with a lot of fundamental design approaches, to pass and return parameters..
value = 2;
goto trigonometry;
value2: ;
is like the processor level actions that go with a subroutine call:
save return address
load the sub address into the program counter
but the processor does that faster than your code.
Close, but no cigar.