Both, on the scale of the amount of flash the Arduino has, are incredibly tiny.
The long-winded way would have 4 blocks of:
if ((digitalRead(button1) == LOW) && (digitalRead(button2) == LOW)) {
 digitalWrite(led1, HIGH);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
}
but with each one having a different combination of LOWs and HIGHs.
The efficient, but somewhat cryptic way, would have an array of LED pins:
byte leds[4] = {3, 4, 5, 6};
and then a routine to select the LED:
byte lednum = digitalRead(button1) | (digitalRead(button2) << 1);
for (int i = 0; i < 4; i++) {
 digitalWrite(leds[i], i == lednum ? HIGH : LOW);
}
I'll just quickly describe what is going on there. First, the array is just a simple list of pins. Not mystery there.
Then there's the lednum bit. digitalRead returns either a 1 for HIGH or 0 for LOW. In binary these are 0b00000001 and 0b00000000 respecitvely. So, digitalRead(button1) and digitalRead(button2) would both return either 0b00000001 or 0b00000000. We shift the result of the second digitalRead 1 place to the left, though, so instead of 1 or 0 it returns 2 or 0 - in binary 0b00000010 or 0b00000000.
We then OR those together, which basically superimposes one over the other, which will give us 4 possible combinations:
0b00000000 - no buttons pressed
0b00000001 - button 1 pressed
0b00000010 - button 2 pressed
0b00000011 - both buttons pressed
These binary values, in decimal are 0 to 3. So we then have a little loop going from 0 to 3. In that loop we are turning each of the LEDs either on or off. The little bit of code
i == lednum ? HIGH : LOW
is a short-hand embedded if statememt. It's saying "Is i equal to lednum ? If so use the value HIGH : otherwise use the value LOW. So that is turning off all the LEDs that aren't the selected one, and turning on the one that is.