Well, yes, but some things are needed to be called in main loop, like drawing. As for your suggestion regarding segfault (calling inherited in destroy last), it didn't fix the issue.

@User137: Segfault is even there if only I'm destroying only MainMenuState, without touching CurrentState.

As for overriding, let the compiler speak for itself:
Quote Originally Posted by FPC
states.pas(32,17) Error: There is no method in an ancestor class to be overridden: "TMainMenuState.Update;"
states.pas(33,17) Error: There is no method in an ancestor class to be overridden: "TMainMenuState.BeforeDraw;"
states.pas(34,17) Error: There is no method in an ancestor class to be overridden: "TMainMenuState.Draw;"
states.pas(35,17) Error: There is no method in an ancestor class to be overridden: "TMainMenuState.Main;"
states.pas(48,1) Fatal: There were 4 errors compiling module, stopping
And those methods are in ancestor (TState)!