It's not wrong to return JSON from your REST API, but if your REST API is about people/projects/roles then that has nothing to do with with vertices/edges/properties - I would abstract away those concepts from the users of the API. You might have a person vertex but the shape of a person vertex as JSON is different than the shape of a person entity in your REST API. Just consider the hierarchy of a Vertex:
I don't think that trying to return that format from g.V().has('person','name','marko') in your REST API is useful to the APIs users. While that output contains all the data about person (as a Vertex), I think that from a REST API perspective you want something more meaningful to the domain you are writing this API for. As an example, you already mentioned that you want to return relationships to other entities tied to that person. The above vertex is from The Crew toy graph...consider the case of a REST API based on that and you wanted to return a person and their skills - you devise this bit of Gremlin:
gremlin> g.V().has('person','name','marko').project('person','software').by().by(out('uses').fold())
==>[person:v[1],software:[v[11],v[10]]]
pass that through the GraphSON mapper and you get:
Your data is all there but none of that looks like a "Person Entity". Someone not familiar with Graphs/Vertices/Edges using your API wouldn't have an easy time working with that. It also suffers from retrieving all properties when you might not need them. You wouldn't do a SELECT * FROM table in SQL - the same concepts apply here - only get the data you need. I think a REST API is better designed with entities that stand on their own without "graph/vertex/edge" influence. All that means is writing your Gremlin differently:
gremlin> g.V().has('person','name','marko').
......1> project('name','location','skills').
......2> by('name').
......3> by(values('location').fold()).
......4> by(out('uses').values('name').fold())
==>[name:marko,location:[san diego,santa cruz,brussels,santa fe],skills:[tinkergraph,gremlin]]
This JSON is so simple I can even paste it here without formatting:
{"name":"marko","location":["san diego","santa cruz","brussels","santa fe"],"skills":["tinkergraph","gremlin"]}
and you don't need a GraphSON toolkit to serialize simple lists/maps. The code Jason Plurad presented shows how simple it is in python to do that. Anyway, I hope that helps in some way.