It read a port just like it reads memory (to which it's mapped.) So speed is how fast an instruction can read memory. EEPROM is a different animal.
Might get it a little faster by replacing
buttonState = digitalRead(buttonPin);
with
buttonState = PORTB & _BV(buttonPin);
Assuming it's PORTB that you are using. This will alleviate at least one function call, I would think, and will generate a single instruction to read the port into the variable. It may require an instruction to load the variable address, but that's up to the compiler. The replacement may be more trouble porting to other micros. Normally you don't see a variable as a parameter although legal, usually a constant in a #define.
_BV(INPUT_PIN_X) is a macro (BV is for 'bit value') that expands to
(1 << INPUT_PIN_X)
dannyf times seem quick to me, but it sounds like he's done the testing. Is he taking into account the complete function call as part of the time? I run at 1Mhz normally, so it's more difficult to relate.
Take Majenko advice and start reading the generated assembler :)
Best of luck.