In general, performance differences are usually negligible as long as they don't turn up during benchmarking (you probably know what people say about premature optimization...).
So, it's mostly a matter of style. Writing a
GraphStage is the lowest level you can implement something in
akka-stream. It's very explicit and somewhat predictable what happens but the amount of code to write can be quite
cumbersome and with a growing number of ports, managing the state space and all the possible interactions can be
quite a challenge.
Wiring up predefined combinators using the GraphDSL is therefore often recommended. In the best case it's just "plug and play". On the other hand, it also introduces new degrees of freedom and non-determinism as elements flow