I suggest keeping them in an array to begin with, and maybe having some macros defined that make it clear what each element of the array refers to. So you can say:
vars[SPEED] = 2;
vars[GRAVITY] = 0.3;
etc. (where SPEED is a macro defined as '0' and so on), and you would be able to loop through them all and copy one bunch to another, or save them all easily. Arrays aren't exactly passed by reference, though if you use the accessors (i.e. vars[@ SPEED]= ... ) then it just refers to them by reference. And if you used a ds_list instead of an array, then it definitely passes by reference.
Alternatively, you could do the same thing but put the values in a buffer - then you can use the buffer_get_address command to get a genuine pointer, which you could pass to a DLL if you wanted.