gotoをさけるためじゃない
適切な初期化と適切な後始末ができる機能を提供している

しかもオレが書いたコードは
全部眺めなくても初期化のしかたと後始末の仕方が分かるエレガントなコードだからな
コードの見通しもよくなる

int void func() {

 t_aho_t* pt_aho;
 int i_ret;

 // 初期化処理
 if ((i_ret = 初期化(&pt_aho)) < 0) {return i_ret; }

 if (read(pt_aho->fd, p_mem, 1) < 0) { 後始末(pt_aho); return ERROR_INIT_AHO4; }
 if (fprintf(pt_aho->fd, "%c\n", *p_mem) < 0) { 後始末(pt_aho); return ERROR_INIT_AHO5; }

 // 終了
 後始末(pt_aho)
}

なんの処理をやってるコードかすぐに分かる
初期化処理と後始末ばっかりが何行も続くコードなんかだれも読みたくないからな