Untried, but the principle is sound (probably...):
EDIT - Now tried and tested - my unforgivable error rectified by bedges!
; [GROUP,MARKER/OBJECT/POS] Exec "teleport.sqs"
_group = _this Select 0
_units = Units _group
_finish = something _this Select 1
; derive your target position however
_finishx = _finish Select 0
_finishy = _finish Select 1
_start = GetPos (_units Select 0)
_startx = _start Select 0
_starty = _start Select 1
_gpx = []
_gpy = []
{_gpx = _gpx + [((GetPos _x) Select 0) - _startx]} ForEach _units
{_gpy = _gpy + [((GetPos _x) Select 1) - _starty]} ForEach _units
_imax = Count _units
_i = 0
#loop
(_units Select _i) SetPos [_finishx + (_gpx Select _i),_finishy + (_gpy Select _i),0]
_i = _i + 1
?(_i >= _imax): exit
Goto "loop"
exit
; in theory, this sets up two arrays of x and y offsets from a 'datum' unit in the group.
; All units are then setpossed to the new position plus the relevant offsets.
; There is an assumption that ForEach works from element 0 up,
; and that adding elements to an array puts them at the high end, not the low.
; i.e. [0,1,2,3,4] + [z] = [0,1,2,3,4,z] and not [z,0,1,2,3,4] or worse!
Assuming they move as intended, how long they will stand there dumbly adjusting to their new surroundings I don't know.
If you want a group to be teleported while moving (like they're coming out of a building), start them moving towards their real destination and use a simpler script to teleport them to the same point (e.g. the door) with a delay between each - as they appear, they move away and clear the space for the next one.