Many of the languages of the era, BASIC dialects included, just wouldn't recurse. You could call a single subroutine and return from that one, but it would either terminate with an error or overwrite the first return address if you tried to use it like a stack. So you would have to manage the entire thing manually - addresses and variables both. With enough POKE and PEEK you could certainly rig up a solution.
(C having a callstack is actually a pretty big deal, and not everyone adapted to it well at the time.)
Which dialects?? A stack is the obvious thing to have. You'll already need something like for nested FOR loops, so it's the obvious thing to do for GOSUB as well. I'd be surprised to hear that any non-toy implementations didn't have a GOSUB/RETURN stack.
ZX81 BASIC has a GOSUB/RETURN stack. MS BASIC has a GOSUB/RETURN stack. Atari BASIC has a GOSUB/RETURN stack. Apple 1 BASIC has a GOSUB/RETURN stack! - sure, it appears to be all of 8 deep, so good luck with using it for anything recursive, but it's a stack nonetheless...
You need to keep a set of global pointers to arrays for all internal state of the function, increment it on the entry point and decrement it before the subroutine's RETURN.
(C having a callstack is actually a pretty big deal, and not everyone adapted to it well at the time.)