Display typeface vs text typeface
Some fonts are drawn to be seen big, others to be read small. Using one for the other job is why your type looks off.
See it
What it is
A display typeface is drawn to be seen big: tight default spacing, high stroke contrast, small counters, sharp details, personality cranked up. A text typeface is drawn to be read long: generous spacing, open counters, sturdier thin strokes, larger x-height, personality dialed back so nothing snags the eye at line 40. Same alphabet, opposite jobs.
Many families ship both and say so in the name: Playfair Display, Source Serif Display, Roboto Serif's optical size axis. Historically metal type solved this automatically, because a 6pt punch was cut differently from a 72pt one. Variable fonts brought that back as the 'opsz' optical sizing axis, which retunes the drawing as the size changes.
Gotcha in both directions. Shrink a display face into a paragraph and the hairlines break up while the tight spacing turns words into mush. Blow a text face up to 96px and it looks flabby and loose, with gaps between letters you can park a car in. The real fix for the second case is a display cut of the family, or an 'opsz' axis if the font is variable. Tracking and kerning only move letters around; they cannot change the proportions, stroke treatment, or detailing that made the text face a text face. Tighten the tracking after you have the right cut, not instead of it.
Ask AI for it
Use two optical sizes of type on this page. Headings: an actual display cut (tight spacing, high stroke contrast, fine detail) at 48px and up, then adjust tracking (start around -0.02em) only after the cut is right. Body: a text cut with a large x-height, open counters, and sturdy strokes at 17px with 1.6 line height and a measure of 65 characters. If the family is variable, drive the 'opsz' axis from the font size instead of swapping families. Do not try to fake a display cut by tracking a text face out or in.