gotoがだめでもbreakが許容できるなら以下でも。
do ; while (0); をマクロ以外で使うのはきもいとか言われるかもしれんが

do {
fp0 = fp1 = NULL;
if (! (fp0 = fopen(...)) ) break ;
if (! (fp1 = fopen(...)) ) break ;
// ...
} while (0);

// さらにきもく
#define ffree(fp) (fp ? fclose(fp) : 0)
ffree(fp0);
ffree(fp1);
fp0 = fp1 = NULL;

趣旨からずれるけど >>619 って errno 保存しておかないと warn が最後のエラーを他のファイルのエラーとして報告しちゃうような。
perror 系は原因のすぐ近くで使うほうがいいかも。それはそうと僕は断然 goto ですねえ。

if (! (fp0 = fopen(...)) ) goto L0;
if (! (fp1 = fopen(...)) ) goto L1;
// ...
fclose(fp1);
L1:
fclose(fp0);
L0:

ながながとすまん