Actually FORTH despite being so low level lends itself perfectly for writing complex software in it because it allows for a great bottom up style programming in a similar fashion as LISP does. You would start your application (or game) with higher level words abstracting all machine details and then write your game engine on top. Then you would go on defining a set of words allowing you to define levels and characters easily on top of the engine. So well written FORTH applications were just layers and layers of specialized DSLs working together to solve complex problems. With the right abstractions, the code was easy to read in the end and also easy to port across different architectures.
Unlike LISP, however, FORTH did not come with memory management or a complex run time. So it was way better suited for the small 8-bit micros back in the 80s. One of the British micros even came with a FORTH runtime instead of BASIC: https://en.wikipedia.org/wiki/Jupiter_Ace. But, unfortunately, BASIC turned out to be much more popular, although usually being too slow and inflexible.
I remember BASIC 2.0 -- which shipped with the C64 -- not providing any kind of abstractions around the particular hardware features the machine provided (like sound, graphics and sprites). It was very frustrating especially for beginners that just wanted to create their own little games. But that was almost impossible without embedded machine codes and the resulting BASIC programs much harder to read and understand than FORTH code.