Well functions require passing data... they are much faster if you use pointers.
When you use a GOSUB, you are still withen the main source, and all local variables are readily available to use.
When you use a FUNCTION, you are jumping out of the main source into a sub routine, and 'passing' it values. Now if all of the values you use in your functions are declared as GLOBALS, this will speed up the process, but run like hell on larger programs when the amount of used variables start to range in the thousands.
The best thing to do, is make a POINTER, and 'point' to the local variable that you want to 'pass' to the function. By sending a pointer, you are only sending a reference to the variable, instead of the intire variable.
This might not seem like a big deal, when you are looking at one or two Integers. But when you want to create a function that reffers to an intire array, a Pointer is the way to go.
There is one last note about Gosubs:
If you use a gosub, you can get caught with all kinds of nasty problems in your code. Almost anything in computer programming can be done in more then one way. You are much better off to never use them except for troubleshooting, or moving massive amounts of code to the bottom of your program, to increase readability.
rem Main Execution Loop ~ In Game
DO
gosub AI_Stuff
gosub Player_Stuff
gosub World_Stuff
SYNC
LOOP
END
AI_Stuff:
do stuff here
RETURN
Player_Stuff:
do stuff here
RETURN
World_Stuff:
do stuff here
RETURN
All said, I still strongly recommend not using it until you are very experienced on reading code.