[Edit] My original answer appears below, but here's a better answer for anyone else who runs into this issue.
Hugo uses Goldmark to parse markdown, and by default it sets markup > goldmark > renderer > unsafe to "false." This means that if you mix HTML in with your markdown, hugo will throw an error instead of rendering the HTML.
If you change the "unsafe" setting to "true," hugo will render your HTML. You make this setting in your config.yaml file (or config.toml or config.json, whichever you're using). For info on how to apply this setting, see https://gohugo.io/getting-started/configuration-markup/#goldmark.
Note that when unsafe=true, you can break your page layout if you write bad HTML. Typically, though, you just want to throw in something like [div class="whatever"][/div]. Most people are smart enough not to screw that up.
[Original Response] This is actually kind of a pain in the ass. You need to create your own shortcode. In your Hugo project directory, create a file called attr.html in the following location:
/layouts/shortcodes/attr.html
Then put this in attr.html:
<p
{{ if .Get "class"}}class="{{ .Get "class" }}"{{ end }}
{{ if .Get "id" }}id="{{ .Get "id" }}"{{ end }}
{{ if .Get "name" }}name="{{ .Get "name" }}"{{ end }}
{{ if .Get "style" }}style="{{ .Get "style" }}"{{ end }}
>{{ .Inner }}</p>
Then, going back to your markdown file, do this:
{{< attr class=".font-normal .text-lg" >}}This is some paragraph text.{{< /attr >}}
You should end up with this output:
<p class=".font-normal .text-lg">This is some paragraph text.</p>
The shortcode above supports id, name, and style attributes as well. If you need more, you'll have to add them to the shortcode template. Also note that this template assumes you want "p" tags in your output.