The interface the client uses is always going to be some sort of state transfer system, moving between different pieces of content and displaying elements to transfer between content.
Handling these views on the back end is an entirely different issue.
State machines are useful on the back end, but it can not be used between requests without causing headaches.
I have been experimenting with state machines in a node.js framework to handle asynchronous sub-views (https://github.com/Dashron/roads). It makes development incredibly simple, and breaks up the code so that you can have traditional, or single page apps with the same codebase.
I don't think a state machine would be useful at a higher level than this (in the backend) but I will put more thought into it.