Read your code! It's doing exactly what you tell it to do!
----------------assume the button is pressed to start with
low portb.3 ----- starts off LED off
buttons:
if portb.7 = 0 then 'the button is pressed, light the LED
high portb.3
endif
if portb.7 = 1 then 'the button is pressed, so don't light the LED
low portb.3
endif
goto button

Now the other way around...assume the button is not pushed...........

low portb.3 ----- starts off LED off
buttons:
if portb.7 = 0 then 'the button is not pushed, so this if/then does not execute
high portb.3
endif
if portb.7 = 1 then 'the button is pressed, so light the LED
low portb.3
endif
goto button

And besides all that, at the end, don't you want to 'GOTO BUTTONS' instead of 'BUTTON'???


What you probably want is something like this:
DEFINE OSC 48
TRISB.3 = 0 : TRISB.7 = 1 : state var bit : state = 0 : portb.3 = state

buttons:
portb.3 = state 'turn the led on or off according to the state bit
if portb.7 = 1 then 'if button is not pressed, don't do anything
goto buttons
endif

if portb.7 = 0 then 'if the button is pressed
if state = 0 then 'if the LED was off last time...turn it on...
state = 1
else
state = 0 'otherwise turn it off (since it was on last time)
endif
endif
portb.3 = state 'turn the led on or off according to the state bit
pause 100
waitforrelease:
if portb.7 = 0 then
goto waitforrelease 'wait for the button to be released before checking it again
endif
goto buttons
end

Think about it for a bit...