Unfortunately, there is no “works all the time” answer. The closest easy solution is using compound=true (compound | Graphviz) plus ltail and lhead.
If this works for you, great. If not, maybe we can find a better solution.
digraph G {
// edges have to be node-to-node
// compound allows pseudo cluster-to-cluster
// minlen to keep on same rank
// nodesep to spread things out
compound=true
nodesep=.55
subgraph cluster_something {
label = "something";
thing1;
thing2;
}
subgraph cluster_other {
label = "other";
thing3;
thing4;
}
thing2 -> thing3 [minlen=0 ltail="cluster_something" lhead="cluster_other"]
}