Yes, splines=ortho fails miserably if ports are specified (see
spline = ortho produces unexpected output with ports (#1415) · Issues · graphviz / graphviz · GitLab).
splines=ortho does OK if ports are not specified (see below) - node placement usually works but the port chosen by “ortho” is not always “best” and the edge route is sometimes “suboptimal”.
Your input without ports:
digraph{
splines="ortho"
rankdir=TB
node [shape=box]
a -> b
a -> c
b -> c
b -> d
c -> d
c -> e
d -> a
}
Giving: