g | x | w | all
Bytes Lang Time Link
216Python 3.8 prerelease250426T121145Zsquarero
263AWK250429T145531Zxrs
2878Google Sheets250428T193147Zdoubleun
2628JavaScript Node.js250429T124858Zdoubleun
276Ruby p250426T045856ZValue In
06805AB1E250428T073716ZKevin Cr
nanUiua250427T133159ZJoao-3
070Charcoal250426T132812ZNeil
nanJelly250426T182946ZJonathan
213JavaScript Node.js250426T123236Zl4m2

Python 3.8 (pre-release),  200  199 or  217  216 bytes

-1 byte from both: use '%d'%x instead of str(x) to save a byte of whitespace (source).

199 bytes if a map object of lines is sufficient:

lambda x:map(''.join,[*zip(*[((t:=''.join(map(lambda x:chr(x-1and x+9470or 32),b'ywxvxxx&yy&wxvvxw&&w'))[int(c)*6:])[:6:3],t[1:6:3],t[2:6:3])for c in'%d'%x])])

216 bytes if multiline output is required (as per challenge):

lambda x:print(*map(''.join,[*zip(*[((t:=''.join(map(lambda x:chr(x-1and x+9470or 32),b'ywxvxxx&yy&wxvvxw&&w'))[int(c)*6:])[:6:3],t[1:6:3],t[2:6:3])for c in'%d'%x])]),sep='\n')

Try it online! (199 bytes)
Try it online! (216 bytes)

AWK, 155 chars, 263 bytes

{for(;i++<NF;p=p substr("└┘╶┴└╴╶┘ ╵╶┘└┘ ╵└┘ ╵",x,2)){s=s substr("┌┐ ┐╶┐╶┐╷╷┌╴┌╴╶┐┌┐┌┐",(x=$i*2+1),2);t=t substr("││ │┌┘╶┤└┤└┐├┐ │├┤└┤",x,2)}}$0=s"\n"t"\n"p

Attempt This Online!

Google Sheets, 179 chars, 287 UTF-8 bytes

=reduce(,{1,2,3},lambda(r,j,r&reduce(,sequence(len(A1)),lambda(s,i,s&mid(index({"┌┐ ┐╶┐╶┐╷╷┌╴┌╴╶┐┌┐┌┐","││ │┌┘╶┤└┤└┐├┐ │├┤└┤","└┘╶┴└╴╶┘ ╵╶┘└┘ ╵└┘ ╵"},j),2*mid(A1,i,1)+1,2)))&"
"))

Put the digits in cell A1 and the formula in B1.

screenshot

Ungolfed:

=let(
  a, { "┌┐ ┐╶┐╶┐╷╷┌╴┌╴╶┐┌┐┌┐";
       "││ │┌┘╶┤└┤└┐├┐ │├┤└┤";
       "└┘╶┴└╴╶┘ ╵╶┘└┘ ╵└┘ ╵"
     },
  reduce("", sequence(3), lambda(r, j,
    r &
    reduce("", sequence(len(A1)), lambda(s, i, let(
      f, lambda(t, mid(t, 2 * mid(A1, i, 1) + 1, 2)),
      s & f(index(a, j))
    ))) &
    char(10)
  ))
)

JavaScript (Node.js), 154 chars, 262 UTF-8 bytes

$=>[0,1,2].reduce((r,j)=>r+[...$].reduce((s,c)=>s+(a=["┌┐ ┐╶┐╶┐╷╷┌╴┌╴╶┐┌┐┌┐","││ │┌┘╶┤└┤└┐├┐ │├┤└┤","└┘╶┴└╴╶┘ ╵╶┘└┘ ╵└┘ ╵"])[j][2*c]+a[j][2*c+1],'\n'),'')

Port of my Google Sheets answer.

Try it online!

Ruby -p, 278 276 bytes

s=$/
gsub(/./){$><<%w'┌┐ \ ┐ ╶┐ ╶┐ ╷╷ ┌╴ ┌╴ ╶┐ ┌┐ ┌┐'[i=$&.to_i]
s+=%w'││ \ │ ┌┘ ╶┤ └┤ └┐ ├┐ \ │ ├┤ └┤ ││'[i]
%w'└┘ ╶┴ └╴ ╶┘ \ ╵ ╶┘ └┘ \ ╵ └┘ \ ╵ └┘'[i]}
puts s

Attempt This Online!

Explanation

#! ruby -p              # Take input, run code, then output
s=$/                    # Initialize middle row to newline
gsub(/./){              # Replace each character of input...
            i=$&.to_i   #   Get int value of character
$><<%w'...'[         ]  #   Print top row symbol immediately
s+=%w'...'[i]           #   Add symbols to middle row
%w'...'[i]}             # ... with the corresponding symbols
puts s                  # Print middle row
                        # (Bottom row printed automatically)

05AB1E, 68 bytes (without bonus)

•ʒÚĆu¬&“
∞M>ζ¿?>∞‹6×d7Δ¦+Ï+5••´A¼P¬`ĀpòÅ·¶²ˆ³Çûô~j•4°вçÅвJ2ô3ôISèøJ»

Try it online.

05AB1E, score: 69 (92 bytes - 25% bonus)

•ʒÚĆu¬&“
∞M>ζ¿?>∞‹6×d7Δ¦+Ï+5••„`~f₂λ£Îy≠¦т3“ ¢`Ûλö+·âŠ)u$₃₃vƒH†á-āò!θ™•4°в2äIèçÅвJ2ô3ôISèøJ»

Try it online.

Explanation:

•ʒÚĆu¬&“
∞M>ζ¿?>∞‹6×d7Δ¦+Ï+5• 
               # Push compressed integer 23726136957641056461562494931500353271689051299106857692814144430

               # Without bonus:
•´A¼P¬`ĀpòÅ·¶²ˆ³Çûô~j•
               #  Push compressed integer 948895909496949200329484950894749588958995919500
 4°            #  Push 10000 (10 to the power 4)
   в           #  Convert the large integer to a base-10000 list:
               #   [9488,9590,9496,9492,32,9484,9508,9474,9588,9589,9591,9500]
               # With bonus:
•„`~f₂λ£Îy≠¦т3“ ¢`Ûλö+·âŠ)u$₃₃vƒH†á-āò!θ™•
               #  Push compressed integer 948895909496949200329484950894749588958995919500949195949499949500329487951594759473959395959507
 4°в           #  Convert it to a base-10000 list:
               #  [9488,9590,9496,9492,32,9484,9508,9474,9588,9589,9591,9500,9491,9594,9499,9495,32,9487,9515,9475,9473,9593,9595,9507]
    2ä         #  Split it into two equal-sized parts
      Iè       #  Get the 0-based first input'th part

ç              # Convert the integers to characters with those codepoints
 Åв            # Convert the first integer to this base-"┐╶┘└ ┌┤│╴╵╷├" list,
               # aka convert it to a base-length list and index into the string
   J           # Join the list of characters together to a string
    2ô         # Split it into substrings of size 2
      3ô       # Then split that into sublists of size 3
        I      # Push the second input-integer
         S     # Convert it to a list of digits
          è    # Index each into this list
           ø   # Zip/transpose; swapping rows/columns
            J  # Join each inner list together to strings
             » # Join all strings with newline delimiter
               # (after which the result is output implicitly)

See this 05AB1E tip of mine (sections How to compress large integers? and How to compress integer lists?) to understand why •ʒÚĆu¬&“\n∞M>ζ¿?>∞‹6×d7Δ¦+Ï+5• is 23726136957641056461562494931500353271689051299106857692814144430; •´A¼P¬`ĀpòÅ·¶²ˆ³Çûô~j• is 948895909496949200329484950894749588958995919500; •´A¼P¬`ĀpòÅ·¶²ˆ³Çûô~j•4°в is [9488,9590,9496,9492,32,9484,9508,9474,9588,9589,9591,9500]; •„`~f₂λ£Îy≠¦т3“ ¢`Ûλö+·âŠ)u$₃₃vƒH†á-āò!θ™• is 948895909496949200329484950894749588958995919500949195949499949500329487951594759473959395959507; and •„`~f₂λ£Îy≠¦т3“ ¢`Ûλö+·âŠ)u$₃₃vƒH†á-āò!θ™•4°в is [9488,9590,9496,9492,32,9484,9508,9474,9588,9589,9591,9500,9491,9594,9499,9495,32,9487,9515,9475,9473,9593,9595,9507].

Uiua, 167 163 bytes + Bonus => Score = 125.25 122.25

The bytes here are counted with the SBCS bytes metric that appears upon hovering on a function in the pad.

≡&p/≡⊂⊏:∧(⍜⊙↻⊂@ )12_25+9472⊂@\0"$uvwt#+yz{x"+×13:°⋯↯∞_3_2_4⋯₈-@\0⊏:↯∞_3"2T¬9R´9yYªt²4Y²6T92vT2tY"≡⋕°⋕

Try it in the pad!

Apparently, Uiua is good at compressing strings:

Charcoal, 80 70 bytes

E⪪“Z↶∕≧kK»B'´⎚.›{.⊟Iζ7M⊙ω$➙|ⅈ”χ⭆θ⍘℅§ιIλ⭆I⪪”)¶∧q¦Fω↔hςZUV⁵⁹C.4|μ|y§”⁴℅ν

Try it online! Link is to verbose version of code. Explanation: Uses a look-up table where each row of each digit is encoded by an ASCII character whose ordinal is converted to base 12 using a custom string of box-drawing characters as digits, chosen so that all of the required characters are printable ASCII.

  “...”                    Compressed look-up table
 ⪪                         Split into substrings by length
       χ                   Predefined variable `10`
E                          Map over substrings
         θ                  First input
        ⭆                   Map over digits and join
             ι              Current substring
            §               Indexed by
               λ            Current digit
              I             Cast to integer
           ℅                Take the ordinal
          ⍘                 Convert using custom base digits
                   ”...”    Compressed list of character codes
                  ⪪         Split into substrings by length
                        ⁴   Literal integer `4`
                 I          Cast to integer
                ⭆           Map over values and join
                          ν Current value
                         ℅  Character with that ordinal
                            Implicitly print

Previous 80-byte solution:

↑⪪⭆⭆S§⪪”&&LvYζ=⟦Þ´⪫⊞X⁹Kv№DSσ,,⁰∕C!E↘β”⁶Iι§ │┌┐└┘├┤╴╵╶╷⌕βι³

Try it online! Link is to verbose version of code. Explanation: Represents each digit by six letters encoding box-drawing characters, but output left-to-right so that the first letter encodes the bottom left, the third encodes the top left and the sixth encodes the top right box-drawing character of the digit.

    S                   Input as a string
   ⭆                    Map over digits and join
       ”...”            Compressed look-up table of lowercase letters
      ⪪                 Split into substrings by length
            ⁶           Literal integer `6`
     §                  Indexed by
              ι         Current digit
             I          Cast to integer
  ⭆                     Map over lowercase letters
                ...     Box-drawing characters
               §        Indexed by
                   ⌕    Index of
                     ι  Current letter
                    β   In lowercase letters
 ⪪                      Split into substrings by length
                      ³ Literal integer `3`
↑                      Output rotated 90° anticlockwise 

This is 58 characters but each box-drawing character takes 3 bytes to represent for a total of 22 extra bytes. Note that due to a bug in TIO's deverbosifier, it unnecessarily inserts three extra bytes into the code (ATO's deverbosifier does not have that bug).

Jelly, 70 bytes with bonus -> Score = 53.5

DịⱮ“€00ȷYY0TTT“Ð\;wlHÐSw'“æq8æ8tætæt‘ṃYð“µƤƈRṛ’D×+“ḂJȦỴdT`\ẒlX‘+⁽!ⱮỌ⁶;

A full program that accepts two arguments - the non-negative integer and a zero or one indicating boldness - and prints to stdout.

Try it online!

How?

DịⱮ“...‘ṃYð“...’D×+“...‘+⁽!ⱮỌ⁶; - Main Link: N; isBold
           “...’D               - digits of 41447333473
                 ×              - multiply each by {isBold}
                  +“...‘        - vectorised add to [191,74,190,188,100,84,96,92,189,108,88]
                        +⁽!Ɱ    - add 9400 to each
                            Ọ   - from ordinals
                             ⁶; - prefix with a space
                                   -> Chars = " ╷│╶╴├┌┘└╵┤┐"
          ð                     - using {Chars} as right argument...
D                               - digits of {N}
 ịⱮ“...‘                        - 1-index into each of:
                                   [[12, 48, 48, 26, 89, 89, 48, 84, 84, 84],
                                    [15, 92, 59,119,108, 72, 15, 83,119, 39],
                                    [22,113, 56, 22, 56,116, 22,116, 22,116]]
        ṃ                       - base decompress using {Chars} as the digits [1,...,11,0]
         Y                      - join with newline character
                                - implicit, smashing print

Jelly, 60 bytes -> Score = 60

“ḂJȦỴdT`\ẒlX‘⁽!Ɱ+Ọ⁶;ɓDịⱮ“€00ȷYY0TTT“Ð\;wlHÐSw'“æq8æ8tætæt‘ṃY

A full program that accepts a non-negative integer argument and prints to stdout.

Try it online!

How?

“...‘⁽!Ɱ+Ọ⁶;ɓDịⱮ“...‘ṃY - Main Link: N
“...‘                   - list of code-page indices
                           -> [191,74,190,188,100,84,96,92,189,108,88]
     ⁽!Ɱ+               - 9400 plus {that}
                           -> [9591,9474,9590,9588,9500,9484,9496,9492,9589,9508,9488]
         Ọ              - from ordinals
                           -> "╷│╶╴├┌┘└╵┤┐"
           ⁶;           - prefix {that} with a space character
            ɓ           - start a new dyadic chain - f(N, Chars)
             D          - digits of {N}
                “...‘   - list of lists of code page indices
                           -> [[12, 48, 48, 26, 89, 89, 48, 84, 84, 84],
                               [15, 92, 59,119,108, 72, 15, 83,119, 39],
                               [22,113, 56, 22, 56,116, 22,116, 22,116]]
              ịⱮ        - {Digits of N} 1-index into each of {those}
                     ṃ  - base decompress using {Chars} as the digits [1,...,11,0]
                      Y - join with newline characters
                        - implicit, smashing print

JavaScript (Node.js), 213 bytes, bonus

s=>t=>(A=t?'╺┗┏┣ ╹╻┃╸┛┓┫':'╶└┌├ ╵╷│╴┘┐┤',g=x=>s.replace(/./g,c=>A[x[c]]+A[+x[1+c]+4]))('24006220226266244666')+`
${g('74201134313357766377')}
`+g('14104014105145155155')

Try it online!

JavaScript (Node.js), 171 bytes

s=>(A='╶└┌├ ╵╷│╴┘┐┤',g=x=>s.replace(/./g,c=>A[x[c]]+A[+x[1+c]+4]))('24006220226266244666')+`
${g('74201134313357766377')}
`+g('14104014105145155155')

Try it online!