I found out why it was on top of everything else. There is 2 different RenderTypeBuffer.Impl available in client, one is for displaying stuff as part of GUI (in top of world rendering), the other is for world rendering.
Thanks to everyone working with me on this !
Here is a working snippet for anyone struggling with same issue as me (needless to say, it's physical client-side code only)
public void render(RenderWorldLastEvent event) {
Vec3d location; // some location in world
BlockState state; // some BlockState (does not have to be part of world)
renderBlock(event.getMatrixStack(), location, state);
}
public static void renderBlock(MatrixStack matrixStack, Vec3d pos, BlockState state) {
BlockRendererDispatcher renderer = Minecraft.getInstance().getBlockRendererDispatcher();
ClientWorld world = Minecraft.getInstance().world;
IModelData model = renderer.getModelForState(state).getModelData(world, new BlockPos(pos), state, ModelDataManager.getModelData(world, new BlockPos(pos)));
ActiveRenderInfo renderInfo = Minecraft.getInstance().gameRenderer.getActiveRenderInfo();
matrixStack.func_227860_a_(); // push
matrixStack.func_227861_a_(-renderInfo.getProjectedView().getX() + pos.x, -renderInfo.getProjectedView().getY() + pos.y, -renderInfo.getProjectedView().getZ() + pos.z); // translate back to camera
// Overlay texture = custom RGBA on top of texture, 0 -> red
//func_228487_b_ -> display over everything else
//func_228489_c_ -> display as part of chunk rendering
Minecraft.getInstance().getBlockRendererDispatcher().renderBlock(state, matrixStack, Minecraft.getInstance().func_228019_au_().func_228489_c_(), 15728880, OverlayTexture.field_229196_a_, model);
matrixStack.func_227865_b_(); // pop
}