What on earth are you doing that's taking tons of lines of code? It takes about 10 lines or so to add a new sprite:
-Add a load image line in the setup file(assuming it's a newly created button or something, most of my GUI elements are recycled)
-Add the sprite x,y,num code, scale the sprite, set its alpha (all in one line)
-Add commands for it being clicked, usually only a couple lines depending on what the button does.
Here's my full code for that trigger screen.
while 1
delete sprite 2
sprite 1, mousex(), mousey(), 3000 rem mouse sprite
sprite 3, ButtonScale*2, ButtonScale*18, 3040 : scale sprite 3, ButtonScale : set sprite alpha 3, 150 rem back button
sprite 4, ButtonScale*2, ButtonScale*20, 3004 : scale sprite 4, ButtonScale : set sprite alpha 4, 150 rem cancel button
sprite 5, ButtonScale*8, ButtonScale*20, 3046 : scale sprite 5, ButtonScale : set sprite alpha 5, 150 rem done button
sprite 7, ButtonScale*5, ButtonScale*6, 3032 rem trigger properties text
sprite 8, ButtonScale*2, ButtonScale*9, 3033 rem size x text
sprite 9, ButtonScale*6, ButtonScale*9, 3034 rem size y text
sprite 10,ButtonScale*10,ButtonScale*9, 3035 rem size z text
sprite 11, ButtonScale*3.5, ButtonScale*7.4, 3002 : scale sprite 11, ButtonScale : set sprite alpha 11, 150 rem up arrow - x
sprite 12, ButtonScale*3.5, ButtonScale*9.4, 3003 : scale sprite 12, ButtonScale : set sprite alpha 12, 150 rem down arrow - x
sprite 13, ButtonScale*7.5, ButtonScale*7.4, 3002 : scale sprite 13, ButtonScale : set sprite alpha 13, 150 rem up arrow - y
sprite 14, ButtonScale*7.5, ButtonScale*9.4, 3003 : scale sprite 14, ButtonScale : set sprite alpha 14, 150 rem down arrow - y
sprite 15, ButtonScale*11.5,ButtonScale*7.4, 3002 : scale sprite 15, ButtonScale : set sprite alpha 15, 150 rem up arrow - z
sprite 16, ButtonScale*11.5,ButtonScale*9.4, 3003 : scale sprite 16, ButtonScale : set sprite alpha 16, 150 rem down arrow - z
sprite 17, ButtonScale*2, ButtonScale*13, 3036 rem script run text
temp$ = entry$(1)
set current bitmap 3 : ink rgb(10,10,10), 0
box 0, 0, 200, 20
ink rgb(255,255,255), 0
text 0, 0, temp$
get image 3041, 0, 0, 200, 20, 1
cls
text 0, 0, str$(SizeX*10) : get image 3042, 0, 0, 100, 20, 1
cls
text 0, 0, str$(SizeY*10) : get image 3043, 0, 0, 100, 20, 1
cls
text 0, 0, str$(SizeZ*10) : get image 3044, 0, 0, 100, 20, 1
sprite 18, ButtonScale*2, ButtonScale*14, 3041 rem script name box
sprite 19, ButtonScale*2, ButtonScale*10, 3042 rem size x
sprite 20, ButtonScale*6, ButtonScale*10, 3043 rem size y
sprite 21, ButtonScale*10,ButtonScale*10, 3044 rem size z
sprite 22, ButtonScale*14.5, ButtonScale*19, 3054 rem instructions
rem show preview
set camera to image 1, 3037, screen width(), screen height()
sprite 6, ButtonScale*14.5, ButtonScale*7, 3037 : scale sprite 6, ButtonScale*1.5
rem preview window + movement
vx# = object position x(TrigObj) : vy# = object position y(TrigObj) : vz# = object position z(TrigObj)
if rightkey() then vx# = vx# + cos(cangy#) : vz# = vz# - sin(cangy#)
if leftkey() then vx# = vx# - cos(cangy#) : vz# = vz# + sin(cangy#)
if downkey() then vx# = vx# - sin(cangy#) : vz# = vz# - cos(cangy#)
if upkey() then vx# = vx# + sin(cangy#) : vz# = vz# + cos(cangy#)
if keystate(56) or keystate(184) then inc vy# rem alt
if controlkey() then dec vy#
inc camdist#, mousemovez()/24
if camdist# > 0 then camdist# = 0
cangx# = camera angle x(1) : cangy# = camera angle y(1)
cangx# = cangx# + mousemovey()/3
cangy# = wrapvalue(cangy# + mousemovex()/3)
if cangx# > 80 then cangx# = 80
if cangx# < -80 then cangx# = -80
position object TrigObj, vx#, vy#, vz#
position object 2, vx#, vy#, vz#
position camera 1, vx#, vy#, vz#
if mouseclick()=2 then rotate camera 1, cangx#, cangy#, 0
move camera 1, camdist#
scale object TrigObj, SizeX*10, SizeY*10, SizeZ*10
coll = sprite collision(1,0)
if coll > 0
set sprite alpha coll, 255
if mouseclick() = 1
if Toggle = 1
select coll
case 3: rem back
Screen = 2
exit
endcase
case 4: rem cancel
Screen = 0
exit
endcase
case 5: rem done
Screen = 5
exit
endcase
case 11: rem up arrow x
if shiftkey()
inc SizeX, 1
else
inc SizeX, 5
endif
endcase
case 12: rem down arrow x
if shiftkey()
dec SizeX, 1
else
dec SizeX, 5
endif
if SizeX < 0 then SizeX = 0
endcase
case 13: rem up arrow y
if shiftkey()
inc SizeY, 1
else
inc SizeY, 5
endif
endcase
case 14: rem down arrow y
if shiftkey()
dec SizeY, 1
else
dec SizeY, 5
endif
if SizeY < 0 then SizeY = 0
endcase
case 15: rem up arrow z
if shiftkey()
inc SizeZ, 1
else
inc SizeZ, 5
endif
endcase
case 16: rem down arrow Z
if shiftkey()
dec SizeZ, 1
else
dec SizeZ, 5
endif
if SizeZ < 0 then SizeZ = 0
endcase
endselect
endif
Toggle = 0
else
Toggle = 1
endif
endif
set current bitmap 0
text 0, 750, str$(screen fps()) + " " + str$(coll)
sprite 2, 0, 0, 3030 : scale sprite 2, ButtonScale*8.2 : set sprite priority 2, -1 : set sprite diffuse 2, 140, 140, 140
sync
endwhile
ButtonScale is just a constant, so the sprites' positions are adjusted according to screen resolution.
And actually, you don't need the sprite x,y,num-scale sprite-set sprite alpha commands in the main loop unless the buttons change, since they are drawn every loop as long as they exist. I just have it that way because some of the other screens are that way(with different buttons shown depending on a condition) and I just wanted to keep it consistent.
For more advanced button commands, yes, they do require a separate subroutine(I prefer functions, there isn't a single gosub or goto in my program). But any feature you add to a program is going to require a bit of code unless it's simple or done wrongly.

My project passed 3,800 lines with this new screen, and I've still got a huge part to do with this GUI system to implement Newton, and then setting up light zones and finally adding the actual object once all the needed attributes are filled in.
Anyway, hang in there!