With all of the drawbacks, flaws, and inefficiencies Jira still remains our favorite issue tracking. If you don't like Jira, you just don't know how to cook it. Here's our recipe. Start with a project. One project per client/product that has a dedicated team.
Use epics as features/classical user stories, not as containers. Using epics as features instead of containers helps to keep information clean. Epics as containers tend to turn into messes of items somewhat related to the topic but that will never be worked on.
Use user-stories/tasks as work to be done in order to get something achieved. Use subtask as a WBS for layers of work.
Here's a simple example to illustrate the point:
Epic - log in (it has all of the acceptance criteria, test scenario, requirements information etc.)
Tasks: web, ios, android, backend
Subtasks within a given task (say iOS): update UIhandler component, Unit test
Now, you have all kinds of layers needed in order to understand where you are with regard to completion. You know how much work is remaining per a given stack of technology, you know what kinds of work have been accomplished in order to get the overall user story/feature done, you have all of the requirements for a feature/user story in the same place.
If we want to build some form a connection between the work items, we use releases. Each release has a number, name and a quick summary of the work items that are grouped together and the reasoning behind it.
We use daily standups for staying in the loop and resolving problems (more on this later) and therefore we introduced a number of boards each aimed at providing a different slice of information. For a typical project we relly on three boards: product management, daily activity, and a cost estimation board.
List of boards we use
Product management board slices work into epics (that are treated as user-stories/features in our case) so that we see what is lagging behind and what is progressing at a planned pace. As epics are organized in priority order, it's easy to keep everyone's focus on what's really important.
Daily activity is a board that is mostly used by our consultants and engineers to see what's to be done for this week and make sure that nothing is missing.
Cost estimation board relies on custom fields that calculate the cost of building a feature based on the original estimated field and on the hourly rate of the consultant. This is how we can answer a question: how much would it cost for me right away without much of back and forth discussion. Our clients appreciate the speed of this approach and its ability to influence product management decisions. Our clients know how much yet another product idea may cost them, become more thoughtful and way more organized.
A product backlog is not a trash bin. If you/your client is not sure that something is to be developed then you have two options: don't create an item, write it down somewhere else or have a separate space for items that are somewhat related and even have been discussed and agreed upon before, but seem out of the scope of interest now. Place them in a separate Jira project.
As for the structure of the backlog apart from having sprint containers that show work for two-three iterations ahead, we rely on three other containers before work items get to a backlog. Those 'sprints' (they are never launched that's why we use quotes here) are used to differentiate between the importance of the items that may be coming into work. Before an item hits a real sprint backlog it travels between Must, Should, Could containers and if it does not find a place there, it gets to a backlog until it's the right time or until it's disregarded completely.