I just implemented breadcrumb navigation for this blog. How it works is quite neat - we iterate over the sections of the path, and store our current position using a Hugo Scratch variable:

    <!-- Initialise a scratch variable "path" to an empty string -->
    {{ $.Scratch.Set "path" "" }}
    <li><a href="/">Home</a></li>
    <!-- For each non-empty item in the URL path -->
    {{ range $element := split .RelPermalink "/" }}{{ if ne $element "" }}
    <!-- Add the element to the scratch variable -->
    {{ $.Scratch.Add "path" "/" }}{{ $.Scratch.Add "path" $element }}
    <!-- Populate the href from the scratch variable -->
    <li><a href="{{ $.Scratch.Get "path" }}">{{ humanize . }}</a></li>
    {{ end }}{{ end }}

I'd always thought of templating as a stateless thing, but using a stateful variable makes this problem intuitive to solve if you're used to programming in stateful languages.