Does new do anything different than the void pointer casting does?
Yes; it constructs a new object, rather than attempting to assign to an object that doesn't actually exist.
Is there any performance difference between the two?
For trivial types, initialisation and assignment are effectively the same thing, so there will probably be little or no difference. For non-trivial types, they call different user-defined functions (constructor vs. assignment operator), which might do very different things.
Does the second code sample have any vulnerabilities?
For non-trivial types, the assignment operator might make assumptions about the state of the object before assignment, and might go horribly wrong, plunging the program into undefined behaviour, if there is no valid object.
tl;dr Placement new works, dodgy casting is bad.