You should make sure that you use font-related units such as em or ex (which you already do) to draw your symbols as these will scale with the font size. However, there are certain lengths that you just need to try out, such as the height of a capital letter or a digit (which can be different). These may vary across fonts. Of course, the weights of fonts are also very diverse. And then there are fonts that have less weight when printed in larger sizes. Taken together all this, it is probably challenging to create symbols that really fit a font.
As for aligning with the baseline you should make sure that the baseline of the symbols is (for example) at (0em,0em) (via clipping or setting the bounding box of the symbol). Then, if you use lines (and not rectangles) to draw the symbol, you need to shift up the line half of its width so that this part is not below the baseline. The same is true for a line that should fit the top of capital letters (or digits).
An l3draw variant to typeset "serif-style" symbols, but I don't know anything about these symbols, so maybe this style does not really make sense:
\documentclass{article} \usepackage{l3draw} \ExplSyntaxOn \NewDocumentCommand { \Steel } { m } { \draw_begin: \draw_path_rectangle:nn { 0em , 0em } { 0.7em , 0.667em } \draw_path_use_clear:n { clip } \draw_scope_begin: \draw_evenodd_rule: \draw_path_ellipse:nnn { 0.35em , 0.333em } { 0em , 0.2em } { 0.35em , 0em } \draw_path_ellipse:nnn { 0.35em , 0.333em } { 0em , 0.175em } { 0.25em , 0em } \draw_path_use_clear:n { fill } \draw_scope_end: \draw_linewidth:n { 0.175ex } \bool_lazy_any:nT { { \tl_if_eq_p:NN #1 a } { \tl_if_eq_p:NN #1 b } } { \draw_path_moveto:n { 0.35em , 0em } \draw_path_lineto:n { 0.35em , 0.667em } \draw_path_use_clear:n { stroke } } \bool_lazy_any:nT { { \tl_if_eq_p:NN #1 c } { \tl_if_eq_p:NN #1 d } } { \draw_path_moveto:n { 0.45em , 0em } \draw_path_lineto:n { 0.45em , 0.667em } \draw_path_moveto:n { 0.25em , 0em } \draw_path_lineto:n { 0.25em , 0.667em } \draw_path_use_clear:n { stroke } } \draw_linewidth:n { 0.075ex } \bool_lazy_any:nT { { \tl_if_eq_p:NN #1 b } { \tl_if_eq_p:NN #1 c } { \tl_if_eq_p:NN #1 d } } { \draw_path_moveto:n { 0.1em , 0em + 0.075ex / 2 } \draw_path_lineto:n { 0.6em , 0em + 0.075ex / 2 } \draw_path_use_clear:n { stroke } } \bool_lazy_any:nT { { \tl_if_eq_p:NN #1 d } } { \draw_path_moveto:n { 0.1em , 0.667em - 0.075ex / 2 } \draw_path_lineto:n { 0.6em , 0.667em - 0.075ex / 2 } \draw_path_use_clear:n { stroke } } \draw_end: } \ExplSyntaxOff \begin{document} 4\Steel{a}25 4\Steel{b}25 4\Steel{c}25 4\Steel{d}25 \end{document}

It is not trivial to match the right weights as these depend on the font used. Also, different font sizes of Computer Modern have different weights. The symbols above will scale according to the font size, but their weight will stay the same.
Note that letters and digits can have different heights depending on the font. Also, letters with roundings, such as O or C typically have a slight larger height (and also depths) than letters without, such as I. Even serifs or sharpish corners (think top of the A) can protrude a bit from the thought box surrounding each character and may add to the height (or depth). So, you need to be careful when choosing the character to get the height from and when choosing the tool for measuring this height. In TeX, you can get the height of, say, the capital letter I of the current font with \fontcharht\font`I (see: https://tex.stackexchange.com/a/275380/47927).
You could include a switch using \f@size (which returns the current font size as floating point number) to account for larger fonts with less weight:
\documentclass{article} \usepackage{l3draw} \ExplSyntaxOn \dim_new:N \l_explorer_steel_a_dim \dim_new:N \l_explorer_steel_b_dim \dim_new:N \l_explorer_steel_c_dim \makeatletter \NewDocumentCommand { \Steel } { m } { \dim_set:Nn \l_explorer_steel_c_dim { \fontcharht\font`I } \exp_args:No \fp_compare:nNnTF { \f@size } > { 20 } { \dim_set:Nn \l_explorer_steel_a_dim { 0.15ex } \dim_set:Nn \l_explorer_steel_b_dim { 0.05ex } } { \dim_set:Nn \l_explorer_steel_a_dim { 0.175ex } \dim_set:Nn \l_explorer_steel_b_dim { 0.075ex } } \draw_begin: \draw_path_rectangle:nn { 0em , 0em } { 0.7em , \l_explorer_steel_c_dim } \draw_path_use_clear:n { clip } \draw_scope_begin: \draw_evenodd_rule: \draw_path_ellipse:nnn { 0.35em , \l_explorer_steel_c_dim / 2 } { 0em , 0.2em } { 0.35em , 0em } \draw_path_ellipse:nnn { 0.35em , \l_explorer_steel_c_dim / 2 } { 0em , 0.175em } { 0.325em - \l_explorer_steel_a_dim * 0.75 , 0em } \draw_path_use_clear:n { fill } \draw_scope_end: \draw_linewidth:n { \l_explorer_steel_a_dim } \bool_lazy_any:nT { { \tl_if_eq_p:NN #1 a } { \tl_if_eq_p:NN #1 b } } { \draw_path_moveto:n { 0.35em , 0em } \draw_path_lineto:n { 0.35em , \l_explorer_steel_c_dim } \draw_path_use_clear:n { stroke } } \bool_lazy_any:nT { { \tl_if_eq_p:NN #1 c } { \tl_if_eq_p:NN #1 d } } { \draw_path_moveto:n { 0.45em , 0em } \draw_path_lineto:n { 0.45em , \l_explorer_steel_c_dim } \draw_path_moveto:n { 0.25em , 0em } \draw_path_lineto:n { 0.25em , \l_explorer_steel_c_dim } \draw_path_use_clear:n { stroke } } \draw_linewidth:n { \l_explorer_steel_b_dim } \bool_lazy_any:nT { { \tl_if_eq_p:NN #1 b } { \tl_if_eq_p:NN #1 c } { \tl_if_eq_p:NN #1 d } } { \draw_path_moveto:n { 0.1em , 0em + \l_explorer_steel_b_dim / 2 } \draw_path_lineto:n { 0.6em , 0em + \l_explorer_steel_b_dim / 2 } \draw_path_use_clear:n { stroke } } \bool_lazy_any:nT { { \tl_if_eq_p:NN #1 d } } { \draw_path_moveto:n { 0.1em , \l_explorer_steel_c_dim - \l_explorer_steel_b_dim / 2 } \draw_path_lineto:n { 0.6em , \l_explorer_steel_c_dim - \l_explorer_steel_b_dim / 2 } \draw_path_use_clear:n { stroke } } \draw_end: } \ExplSyntaxOff \makeatother \begin{document} \scriptsize 4\Steel{a}25 \normalsize 4\Steel{b}25 \Large 4\Steel{c}25 \Huge 4\Steel{d}25 \end{document}

The weight adjustment is probably hardly visible, but compare the output without the adjusted weights:

Your baseline approach when using TikZ is fine. But you should use coordinates or even just dimensions, not a node for alignment. You can just say baseline=0pt to shift the TikZ box vertically, so that (0,0) sits on the baseline of the surrounding text. You can refer to the current line width using \pgflinewidth in order to adjust the alignment if you want to use \draw. To have the line width scaled proportionally with the font size, use line width=.2ex or similar.
Do show the basics with TikZ, but only schematically:
\documentclass{article} \usepackage{tikz} \newlength{\mycharht} \NewDocumentCommand{\mycharA}{}{% \setlength{\mycharht}{\fontcharht\font`I}% \begin{tikzpicture}[baseline=0pt] \fill (0,0) rectangle (1em,\mycharht); \end{tikzpicture}% } \NewDocumentCommand{\mycharB}{}{% \setlength{\mycharht}{\fontcharht\font`I}% \begin{tikzpicture}[baseline=0pt] \draw[thick] (0,0.5\pgflinewidth) rectangle (1em,\mycharht-0.5\pgflinewidth); \end{tikzpicture}% } \begin{document} \scriptsize 4\mycharA\mycharB 25 \normalsize 4\mycharA\mycharB 15 \Large 4\mycharA\mycharB 15 \Huge 4\mycharA\mycharB 15 \end{document}

thick) and the size of the symbol in a relative unit (ex and em), you could choose one of these.inner sep=0ptin any nodes. Note that the exact height of a character is font dependent, as opposed to\ht\strutbox.\ht0where\sbox0{A}to correctly give the height ofA.tikzsymbols, (2) tex.stackexchange.com/a/736087/319072tikzsymbolsseemed another choice!