Overuse of WITH does make it a bit more imperative, but also makes it easy to shape the result in the form you want it in. Cypher has been a joy to work with. Gremlin, by comparison, does not attract me at all.
Context: In web app usage scenario the tooling available for GraphQL seems more popular (with react libraries) than Cypher.
Cypher is a graph query language.
GraphQL is an API query language to query tree like structures (trees...), nothing to do with graphs actually.
Other than that though, you are quite correct, the two do not serve the same purpose.
Neo4j has an extension that exposes a GraphQL API that converts the queries to Cypher (https://neo4j.com/developer/graphql/#neo4j-graphql-java). I've used it for some basic things but for anything complex you need to be careful and inspect the queries it produces.
Also just because you cannot query at arbitrary depths doesn't mean that GraphQL doesn't work with graphs, just that it might be a poor choice of tool for that work.
https://docs.dgraph.io/master/query-language/#k-shortest-pat...
So it doesn't need to be bad necessarily, if code follows the same conventions.