Here's a real-world example from my previous job. A process makes two simultaneous requests (we're on a tight dead line here). Here is the enumerated states we have to code for:
send 1,2 -> receive 1, receive 2, process
send 1,2 -> receive 2, receive 1, process
send 1,2 -> receive 1, timeout 2, process, receive 2 (which is ignored)
send 1,2 -> receive 1, timeout 2, process (2 is lost)
send 1,2 -> receive 2, timeout 1, process, receive 1 (which is ignored)
send 1,2 -> receive 2, timeout 1, process (1 is lost)
send 1,2 -> timeout 1,2, process, receive 1,2 (which are ignored)
send 1,2 -> timeout 1,2, process, receive 2,1 (which are ignored)
send 1,2 -> timeout 1,2, process, receive 1 (which is ignored; 2 is lost)
send 1,2 -> timeout 1,2, process, receive 2 (which is ignored; 1 is lost)
send 1,2 -> timeout 1,2, process (1,2 are lost)
You might think that after the process step, we can ignore anything we receive, but we need to make sure we ignore the timed out replies, because this "state machine" is running a few dozen/hundred times a second, depending upon load.
As I was leaving, there was talk of making a third concurrent request. States start exploding here. Maybe if there were languages that made this easy to implement they would be used more often (the code in question was in a mixture of C89/C++98).