I wouldn't use them for too much. Every variable that they contain are instance variables - they exist only in the function, and go away when the function does. Variables outside the function are not available, either. Only variables declared as constants are, and this creates a mess of variables.
I use functions for math things, like
return float = getDistance3D(obj1, obj2). I never use them to change object position, variables, etc.
In my current project, I have the whole thing broken up into four files: RPG.dba, RPGsubs.dba, RPGinit.dba, and RPGfunctions.dba. This is my main loop:
mainLoop:
do
gosub subGetInput:
gosub subGetAI:
gosub subMoveObjects:
gosub subMoveCamera:
gosub subGameStats:
update terrain
sync
loop
This uses gosub to go and return to a chunk of code. Chunks of code are easier to identify and modify - a huge main loop can become impossible to navigate. Each sub calls functions if they need to. It lets you organize your code.