Quoting my first comment as requested:
Since one of the largest responsibilities of a game engine is
rendering, this functionality is found in quite a few different
classes - Texture2D, RenderTexture, Material, Camera, Graphics,
Renderer... You're unlikely to find a 1:1 replacement for the way
you'd do it in GDI+, but if you give more details about your specific
use case we can suggest Unity-friendly ways to achieve it
In this case, it sounds like we won't need to do any image modification or generation to get this outcome in Unity. We can use the existing texture scaling & offset capabilities of the built-in shaders.
Here's an example of one image split across 9 quads:
Here all I've done is create a material instance for each piece. I've set the tiling x & y to 1/3, and used a different offset for each piece (every unique x-y combination of 0, 1/3, 2/3)
All of the materials are referencing the same single texture in memory, with no need to modify it or duplicate it into separate sections.
You can either prepare these materials ahead of time in the editor, and assign their texture to reference the one the user selected at runtime, or you can create these materials wholly at runtime and align their texture sections using the Material.mainTextureScale and Material.mainTextureOffset setters.
The same trick works for cubes (you just need to be careful of the face orientation)
(This does result in one draw call per piece, but for such a small number of pieces this isn't anything to worry about. If you were dealing with much more complex scenes, you could instead create a mesh where each quad's UVs reference only the part of the texture it needs, then render the whole mesh with one material, but that's overkill for a small puzzle)