In COBOL the standard way to implement a case structure is by means of the EVALUATE verb. You can accomplish the same thing, somewhat at the expense of formal elegance, with a series of ELSE IF clauses. The main advantage of EVALUATE is that you can terminate it with a single END-EVALUATE. A long ELSE IF chain may require an equally long END-IF chain.
(In C the switch/case construct serves the same purpose; again, you can use else if instead. Though the same constructs are available in C++ as well, virtual functions are more fashionable.)
One solution is to build two levels of case structure. First we branch according to state. Then, possibly in a separate paragraph, the state branches according to event. Alternatively we can branch on event first and then on state.
It is not clear that this technique buys you much. Since you have one big list of cases rather than several small lists, it may be more difficult to verify that you have accounted for all the combinations, especially if someone rearranges the cases in a misguided quest for efficiency.
The main problem with a code-based FSM is that it is so easy to mangle. People accustomed to more conventional coding techniques are likely to rearrange the code, add little tweaks here and there, and generally obscure the overall logical structure (which is obscure enough already).
Further reading