Unless you really use assembler, which I suspect you don't, simply think of goto as if it was non existent. Don't use it.

An example of a very old version of WDL to show what happens with GOTO and similar...

Code:
IF_EQUAL no_new_item,1;
		GOTO no_new_item;
	IF_EQUAL free_item,free_item.MAX;
		END;
	IF_NEQUAL free_item,1;
		SKIP 1;
	RULE i_item1=cur_item+new_amount;
	IF_NEQUAL free_item,2;
		SKIP 1;
	RULE i_item2=cur_item+new_amount;
	IF_NEQUAL free_item,3;
		SKIP 1;
...
no_new_item:
	SET no_new_item,0;
	IF (tot_amount>20) {SET newstring,1;SET info_str,no_setitem_str;GOTO update_inv;}
	SET MY.INVISIBLE,1;
	PLAY_SOUND collect_snd,0.3;
	RULE weight=weight+new_amount*new_weight;
update_inv:
	IF_EQUAL LAYERS.3,inventory_ovr;
	CALL update_inv;