If you want to use d3.geo.path() with transform zoom, then you simply create a new projection that is identical in settings to your current projection except with its scale multiplied by the scale of your zoom behavior and the projection’s translate modified by the translate of your zoom.
You’ll notice that this example, unlike the last one, does not use dataUrl to pass the canvas drawn data to an svg:image. Even though this seems practical in drawing raster data (because you can keep it in the SVG and adjust the drawing order accordingly) it is significantly slower (and sometimes buggy) than just having a canvas element on top of your SVG element.