It’s a batching issue, the way slate is drawn each widget reports what to draw. If it needs to it manually increases the layer that each element is drawn on, it usually does. If it does this too often, then you’ll have no batching because each item is getting a separate layer and draw call. Currently the zorder is a hint, but it doesn’t override the batcher’s ordering for the canvas. The blueprint editor has the same problem if you’ve ever dragged two nodes over top of each other you’ll see weird interleaving.
We need to upgrade the canvas to do some rect overlap tests to determine if new layers are needed to resolve the draw ordering correctly. For the time being you should be able to fix it by actually parenting one widget to another. Use something like nested canvases, or an overlay panel to let the widgets overlap. Or make the image a Border instead of an Image which can take a single child widget, which could be another container or the text you want to display.