If you can still find one, it's worth mentioning that a true parallel port is about as close to a GPIO as you'll find in an off-the-shelf PC. Classic implementations lack some flexibility in that many of the pins have fixed direction, and some are inverted, but people have been working around that for years.
The greater limitation is that such ports are becoming extinct. The more abstract replacements such as USB-parallel converters are typically usable only to control actual printers, and lack registers which you can directly read/write to set or monitor pin state. There have been rumored to be a few which do have this capability, but they can be hard to find, and require detailed attention to drivers.
At that point it tends to become more practical to use a USB-connected I/O device. Often this is a microcontroller running a simple firmware, either from the manufacturer or custom.
One major advantage of a custom implementation is the possibility to offload the lowest level, most repetitive, and/or timing critical parts of I/O manipulation to the processor on the device, instead of trying to do it from the PC where the latency of USB packetization, traversing multiple buses, and multitasking operating systems tend to make bit-by-bit operations painfully slow.
If you haven't yet figured out exactly what form your solution will take, one possibility is to grab something like an Arduino which is packaged in both the hardware and toolchain sense for ease of use, and could operate as either a stand alone solution or as an I/O helper to do low-level tasks under command from an attached PC.