This isn't really an answer, but it was too long for a comment.
How do your graphs differ from a general directed acyclic graph?
A DAG doesn't have to have a root, but I think that makes little difference to drawing the graph.
As far as levels go, for any DAG, it is possible to define a function level(v) such that for any edge vi → vj, level(i) ≤ level(j). A trivial level function is the index of the vertex in a topological order of the vertices. Another one is the length of the longest path from the root to the vertex.
The Reingold-Tilford tree-drawing algorithm draws ordered trees (that is, trees where the edges from a vertex are ordered). Your examples suggest that your graphs are not ordered, and indeed that the main issue you face is finding an edge-ordering which minimizes edge-crossing. So possibly this is the problem you are looking to solve. (It's not an easy problem.)
dot
actually does pretty well with DAGs, in my experience, although it sometimes needs a bit of a helping hand. In particular, if you know the level of each vertex, you can make a subgraph for each level with the attribute `rank = "same"'. (See this example.)