I use the very excellent Org-Mode for GNU Emacs. There is a lot of “startup” effort for it, especially if you are not already an Emacs user. As I was already an Emacs user coming to Org-Mode, it was much less for me.
At it's core Org-Mode is just a simple, plaintext-based, outliner. You can have as Projects as outline heads, tasks as outline sub-items, etc. Pretty much anything you could setup as a “work breakdown structure” in a formal project management system can be represented as an outline. A simple flat todo list can be simulated by a flat outline. The outline paradigm scales up or down to any level of detail you want.
You can “tag” items, either free tagging or you can preset a taxonomy of tags.
There are built-in “agenda” views that collect tasks (and/or tags) from across any and all of your defined Org-Mode files to present a flat todo list from a large collection of Org files, outlines, projects, etc. You can create your own agenda views to support your individual preferences.
As an example of how complex it can become: I've recently updated my system to include concepts from Tony Robbins' Time of Your Life / RPM system where I have my “life plan” as a single Org-Mode file, I have my COIs as individual linked Org-Mode files, and I have projects and tasks that support to COI inside those files. I customized my agenda views so that I can look at a simple small list of just my COI (for regular reflection and reconnection) or I can look at each COI individually with it's projects and tasks or I can look at a list of my today or this week tasks from across all of my COI.
As an example of how simple it can become: I started with a single org-mode file outlined with two top-level outline heads (one for my employer, one for personal) and tasks listed underneath those head. I used built-in agenda views or just the file itself.