The test is arithmetic. A device forwarding ten million packets per second has one hundred nanoseconds per packet. Any decision that must happen per packet has to fit in that, which rules out a software path that can be interrupted, scheduled or delayed by anything else.
So the data plane holds a forwarding table and applies it. It does not compute the table, negotiate with peers, or reason about policy — those are control plane concerns that happen at protocol timescales, thousands of times slower and with no per-packet cost.
The boundary is therefore not a stylistic choice. It is drawn wherever the per-packet budget runs out, and a design that places a control decision inside the packet path has not so much made a trade-off as made an error that will surface as jitter under load.