Since hyperthreading allows for unused cpu time to be used by other
processes, why would this make it seem like 4 logical processors (2
per actual core). How is this different than out of order execution?
This isn't wholly correct. Hyper-threading simply adds an additional execution unit per core (in hardware), but shares the rest of the core, which is why in certain cases hyperthreading can actually reduce performance. Furthermore, hyperthreading does not explicitly "allow unused CPU time to be used by other processes". That is handled by your operating system's process scheduler.
Hyperthreading does, however, expose another "core" to the operating system, allowing it to schedule more programs to run simultaneously. Except in the cases where this would exhaust the shared hardware in a Hyperthreaded core (e.g. if two threads are running on separate execution units in a Hyperthreaded core which heavily use the cache, which is shared by both threads in a HT-core). For technical details about hyperthreading, see the Intel Core Processor Datasheet, Volume 1.
Lets say core0/core1 are one core and core2/core3 are another. If
core0 and core2 are at 100% is my cpu at 100% load or only 50%? Also,
how come processes tend to execute on core0 and core2 rather than
core1 and core3?
It depends which parts of your processor are being stressed (performance gains by HT is very application-specific, again see above). Technically you might only be using 50% of the execution units in Core 0, but the rest of the hardware in the core might be loaded at 100% (e.g. if the program makes heavy use of cache).
For details, see the question How does Windows processor affinity work with hyperthreaded CPUs?.