Is a pullup resistor always required for a switch?

The IO pins do have internal pullups, as you say just use INPUT_PULLUP when setting up the input. Then the input won't float when the switch is open.

However, with long wires or an electrically noisy environment, a lower resistance pullup resistor added externally can help make it more resistant to picking up noise when the switch is open.