First, I think it's worth addressing the remapping issue.
In DX11, the driver does all the heavy lifting, so when you map (write/discard) a resource the driver's doing a bunch of work under the hood, specifically allocating a new buffer and returning you the address (referred to as "resource renaming"). The driver will track when the GPU is done with a particular bit of memory, and will manage when unused memory can be re-used.
For modern APIs (both DX12 and Vulkan) when you create a resource, the resource is explicitly bound to a location in memory. It's a much thinner layer (you're closer to the metal). When you map, you get a pointer. You can keep the resource mapped, forever, and that pointer returned will always be valid, and will always point to the address in memory the GPU will read from. The advantage here is that, since your application knows how it'll be using these resources, you can optimize for your specific use case. For example, if you have a constant buffer for view-dependent data that updates once a frame, and you're buffering 3 frames, you can just create 3 resources, map them all, and just round-robin through them - saving the overhead of API calls etc.
On the virtual memory front, when you map, you get a pointer that's a virtual memory address, that'll be mapped to somewhere in physical, CPU-side memory. So the mapping is definitely to physical CPU memory. How that memory is mapped to the GPU is probably device/system dependent, but I believe in most cases the memory lives on the CPU-side memory and is read by the GPU via the PCIe bus (which is why you upload rather than just let the GPU read from that resource directly).
Given that most apps these days are built for 64-bit architectures, we're generally not super limited with virtual memory address space, but it's still not a bad idea to clean up if you're not going to be using it, since it's still using up resources (page tables for virtual memory mapping, etc).