In real work, it's always a bad idea to use O(N) stack space, so practical DFS-based solutions would use an explicit stack.
The explicit stack implementation is a little complicated, because the stack isn't just a stack of nodes -- you also need to store the current position in the child list for each open node -- and the traversal logic gets a little complicated.
The DFS solution is not awful, but if you want to write a good solid solution, then Khan's algorithm will end up simpler and faster in the worst case. It will also use less memory, because the list of pending nodes is just a list of nodes. (It doesn't matter if you use that list like a stack or queue. In most cases using it like a stack is faster/easier)
So if you're going to explicitly check a directed graph to see if it has cycles, usually Kahn's algorithm is best. The DFS technique is useful if you're already doing a DFS for some other reason and you want to detect cycles along the way.