You could do something like the following for keys:
gremlin> g.V().hasLabel('person').properties().key().dedup()
==>name
==>age
and the following for values:
gremlin> g.V().hasLabel('person').values().dedup()
==>marko
==>29
==>vadas
==>27
==>josh
==>32
==>peter
==>35
As far as "efficient" key lookup, TinkerPop really doesn't provide anything for that. I'm basically iterating all the person vertices above and popping off the key and getting a unique list. Since TinkerPop doesn't have any notion of a schema, it's not as though you can easily just consult that for an answer. If you were using Titan or DSE Graph you could just ask the "schema object" to give you the keys for some vertex label and that would be "fast".